以下代码以第一次调用pthread_cancel时的分段错误结束,但仅限于linux下。在Mac OS下运行正常。我不允许在已经完成运行的线程上调用pthread_cancel吗?也许我根本不应该打电话给pthread_cancel?
#include <iostream>
#include <pthread.h>
using namespace std;
void* run(void *args) {
cerr << "Hallo, Running" << endl;
}
int main() {
int n = 100;
pthread_t* pool = new pthread_t[n];
for(int i=0;i<n;i++) {
pthread_t tmp;
pthread_create(&tmp,NULL,&run,NULL);
pool[i] = (tmp);
}
for(int i=0;i<n;i++) {
pthread_join(pool[i],0);
}
for(int i=0;i<n;i++) {
pthread_cancel(pool[i]);
}
}
答案 0 :(得分:3)
请参阅POSIX XSH 2.9.2:
虽然实现可能具有系统中唯一的线程ID,但应用程序应该只假设线程ID在单个进程中可用且唯一。调用此POSIX.1-2008卷中定义的任何函数并作为参数传递来自另一个进程的线程的线程ID的效果未指定。如果在将detachstate属性设置为PTHREAD_CREATE_DETACHED或者为该线程调用了pthread_detach()或pthread_join()的情况下创建线程,则线程ID终止后,线程ID的生命周期结束。符合性的实现可以在其生命周期结束后自由地重用线程ID。 如果应用程序尝试使用其生命周期已结束的线程ID,则行为未定义。
如果线程已分离,则其线程ID无效,无法用作对pthread_detach()或pthread_join()的调用中的参数。
在引用的线程已加入之后,或者如果线程在分离时终止,则不能使用pthread_t
。只需从程序中删除pthread_cancel
代码即可。这是不对的。 pthread_cancel
用于取消正在进行的线程,并且对于安全使用它而不会导致资源泄漏具有非常棘手的要求。它对于自行退出的线程没有用。