簡體   English   中英

在連接線程上調用pthread_cancel會導致linux下的segfault

[英]Calling pthread_cancel on a join'ed thread causes segfault under linux

以下代碼以第一次調用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]);
    }
}

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用於取消正在進行的線程,並且對於安全使用它而不會導致資源泄漏具有非常棘手的要求。 它對於自行退出的線程沒有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM