在连接线程上调用 pthread_cancel 会导致 Linux 下的段错误

Hei*_*fer 4 c++ pthreads

以下代码在第一次调用 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 5

请参阅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在连接它所引用的线程之后,或者线程在分离时终止时,您不能使用 a 。pthread_cancel只需从程序中删除代码即可。这是不对的。pthread_cancel用于取消正在进行的线程,并且对于安全使用它而不导致资源泄漏有非常棘手的要求。它对于自行退出的线程没有用。