int pthread_join(pthread_t thread, void **retval);
int pthread_tryjoin_np(pthread_t thread, void **retval);
int pthread_timedjoin_np(pthread_t thread, void **retval, const struct timespec *abstime);
pthread_join
retval用于接收线程的返回值。如果不需要,设置为NULLthread所标识的线程的退出thread所标识的线程的资源在调用pthread_join时释放pthread_tryjoin_np
thread指定的线程已终止,则其功能与pthread_join相同thread指定的线程尚未终止,则该函数以错误的方式立即返回pthread_timedjoin_np
abstime指定的时间内结束,则其功能与pthread_join相同源码
#include
#include
#include
#include
void *start_routine(void *ptr)
{
printf("子线程(%lu)开始运行...\n", pthread_self());
sleep(3);
printf("子线程(%lu)即将退出...\n", pthread_self());
return (void*)"9999";
}
int main(int argc, char const *argv[])
{
printf("主线程(%lu)开始运行...\n", pthread_self());
pthread_t thread_id;
pthread_create(&thread_id, NULL, start_routine, NULL);
void *retval = NULL;
pthread_join(thread_id, &retval);
printf("子线程的返回值为:%s\n", (const char*)retval);
printf("主线程(%lu)即将退出...\n", pthread_self());
exit(EXIT_SUCCESS);
}
输出
主线程(140647242364736)开始运行…
子线程(140647242360576)开始运行…
子线程(140647242360576)即将退出…
子线程的返回值为:9999
主线程(140647242364736)即将退出…
源码
#include
#include
#include
#include
void *start_routine(void *ptr)
{
printf("子线程(%lu)开始运行...\n", pthread_self());
sleep(3);
printf("子线程(%lu)即将退出...\n", pthread_self());
return (void*)"9999";
}
void TEST_Join(int timeout)
{
printf("\n");
pthread_t thread_id;
pthread_create(&thread_id, NULL, start_routine, NULL);
sleep(timeout);
void *retval = NULL;
int ret = pthread_tryjoin_np(thread_id, &retval);
printf("函数返回值 :%d\n", ret);
printf("子线程的返回值为:%s\n", (const char*)retval);
printf("\n");
}
int main(int argc, char const *argv[])
{
printf("主线程(%lu)开始运行...\n", pthread_self());
TEST_Join(0); // 调用函数时,子线程尚未结束
sleep(5);
TEST_Join(5); // 调用函数是,子线程已终结
printf("主线程(%lu)即将退出...\n", pthread_self());
exit(EXIT_SUCCESS);
}
输出
主线程(140402546759488)开始运行…
子线程(140402546755328)开始运行…
函数返回值 :16
子线程的返回值为:(null)子线程(140402546755328)即将退出…
子线程(140402538362624)开始运行…
子线程(140402538362624)即将退出…
函数返回值 :0
子线程的返回值为:9999主线程(140402546759488)即将退出…
源码
#include
#include
#include
#include
#include
void *start_routine(void *ptr)
{
printf("子线程(%lu)开始运行...\n", pthread_self());
sleep(3);
printf("子线程(%lu)即将退出...\n", pthread_self());
return (void*)"9999";
}
void TEST_Join(int timeout)
{
pthread_t thread_id;
pthread_create(&thread_id, NULL, start_routine, NULL);
struct timespec ts;
ts.tv_sec = 5;
ts.tv_nsec = 0;
void *retval = NULL;
time_t start, end;
time(&start);
int ret = pthread_timedjoin_np(thread_id, &retval, &ts);
time(&end);
printf("函数耗时 :%lf\n", difftime(end, start));
// ETIMEDOUT = 110;等待在线程结束前终止
// EINVAL = 22
printf("函数返回值 :%d\n", ret);
printf("子线程的返回值为:%s\n", (const char*)retval);
}
int main(int argc, char const *argv[])
{
printf("主线程(%lu)开始运行...\n", pthread_self());
TEST_Join(1); // 调用函数时,子线程尚未结束
sleep(5);
TEST_Join(5); // 调用函数是,子线程已终结
printf("主线程(%lu)即将退出...\n", pthread_self());
exit(EXIT_SUCCESS);
}
输出
未测试出效果
int pthread_detach(pthread_t thread);
源码
#include
#include
#include
#include
void *start_routine(void *ptr)
{
printf("子线程(%lu)开始运行...\n", pthread_self());
sleep(3);
printf("子线程(%lu)即将退出...\n", pthread_self());
return (void*)"9999";
}
int main(int argc, char const *argv[])
{
printf("主线程(%lu)开始运行...\n", pthread_self());
pthread_t thread_id;
pthread_create(&thread_id, NULL, start_routine, NULL);
pthread_detach(thread_id);
sleep(5);
printf("主线程(%lu)即将退出...\n", pthread_self());
exit(EXIT_SUCCESS);
}
输出
主线程(140334013024064)开始运行…
子线程(140334013019904)开始运行…
子线程(140334013019904)即将退出…
主线程(140334013024064)即将退出…