在加入之前退出的线程

时间:2016-08-23 14:50:15

标签: c multithreading thread-safety pthreads thread-synchronization

原谅我,我刚刚开始了多线程的概念,我只是想知道为什么我的线程可能会在他们加入之前退出。基本上,我正在维护一个全局的进程ID列表,我通过调用

迭代地创建它们
   if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) {
        fprintf(stderr, "error thread not created\n"); 
    }

现在的问题是,我的所有线程在进入我的pthread join之前都已退出

pthread_join(thread_id[i], NULL);

深深嵌套在函数调用中,函数调用在创建线程后直接调用。我不确定我是否想要做某些锁定或其他事情,或者添加一个额外的命令以确保线程在退出前等到join语句。

2 个答案:

答案 0 :(得分:2)

来自POSIX文档:

  

pthread_join()函数应暂停执行调用   线程直到目标线程终止,除非是目标线程   已经终止了。从成功的pthread_join()返回   使用非NULL value_ptr参数调用,传递给的值   终止线程的pthread_exit()应该可用   value_ptr引用的位置。当pthread_join()返回时   成功,目标线程已终止。结果   多个同时调用pthread_join()指定相同的   目标线程未定义。如果调用pthread_join()的线程是   取消,然后目标线程不得分离。

所以,不。只要您满足上述要求,您就不需要采取任何额外措施。

答案 1 :(得分:0)

我不完全确定为什么如果线程在pthread_join()声明退出状态之前完成会出现问题?

这是完全正常的。

pthread_create()在指定的函数处启动新的执行线程。该功能立即运行,甚至可以抢占启动器线程。线程有自己的局部变量(堆栈)和线程局部变量。必须协调所有其他共享内存访问或发生数据竞争。通常,共享数据受互斥锁保护。线程将继续运行(通常与其他线程并行),直到它被某些同步操作阻塞或线程退出其启动函数。

线程可以使用pthread_join()等待其他线程成功完成执行。与usr一样,如果线程已经完成,pthread_join()不会等待。