Ter*_* Li 8 c linux posix pthreads segmentation-fault
GDB告诉我,这pthread_kill导致我的程序出现分段错误.基本上我pthread_kill用来检查一个线程是否存在,或者没有给出它的ID.
我一直在网上搜索,发现pthread_kill当TID无效时可能会导致分段错误.是的,我一直在测试我的程序使用"无效"(由我设计)类型的TID int.这可能是真正的原因吗?
bdo*_*lan 14
pthread_t不是线程ID或数字索引.它是一种不透明的类型.弥补价值可能导致崩溃.
在Linux NPTL上,pthread_t用作指针:
int
__pthread_kill (threadid, signo)
pthread_t threadid;
int signo;
{
struct pthread *pd = (struct pthread *) threadid;
Run Code Online (Sandbox Code Playgroud)
应该相当清楚已经出现问题的地方:)请注意,这个指针也是一个实现细节 - 较旧的Linuxthreads实现使用数字索引到表中,你可以确实组成TID并且不要指望事情崩溃.
你需要自己跟踪线程的生命和死亡.A pthread_t有效,直到您pthread_join成功呼叫它为止.如果你想测试一个有效的 是否有效pthread_t,请打电话pthread_tryjoin_np给它; 如果它返回EBUSY,则线程处于活动状态.如果函数成功,将pthread_t不再有效 ; 你不能在这一点上重复使用它 - 所以你必须在某个地方记下那个线程已经死了,并且不再需要再检查了!
当然,您可以实现自己的跟踪系统 - 在一个活跃的地方创建一个表,一个用于分发TID的系统,并将它们传递给新创建的线程.让每个线程在退出之前将其自身标记为死(可能使用,pthread_cleanup_push因此您处理线程取消和pthread_exit),并分离线程,因此您不需要加入它(使用pthread_detach).现在您可以明确控制线程死亡报告.