Вызов pthread_cancel в объединенном потоке вызывает segfault под linux - PullRequest
3 голосов
/ 16 июня 2011

Следующий код заканчивается ошибкой сегментации при первом вызове 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]);
    }
}

1 Ответ

3 голосов
/ 16 июня 2011

См. POSIX XSH 2.9.2 :

Хотя реализации могут иметь идентификаторы потоков, которые являются уникальными в системе, приложения должны только предполагать, что идентификаторы потоков могут использоваться и уникальны в пределахединый процесс.Эффект вызова любой функции, определенной в этом томе POSIX.1-2008, и передачи в качестве аргумента идентификатора потока из другого процесса не определен.Время жизни идентификатора потока заканчивается после завершения потока, если он был создан с атрибутом detachstate, установленным в PTHREAD_CREATE_DETACHED, или если для этого потока были вызваны pthread_detach () или pthread_join ().Соответствующая реализация может повторно использовать идентификатор потока после истечения срока его службы. Если приложение пытается использовать идентификатор потока, время жизни которого истекло, поведение не определено.

Если поток отсоединен, его идентификатор потока недопустим для использования в качестве аргумента в вызовеto pthread_detach () или pthread_join ().

Вы не можете использовать pthread_t после того, как поток, к которому он относится, был присоединен, или если поток был прерван во время отсоединения.Просто удалите код pthread_cancel из вашей программы.Это не правильно.pthread_cancel предназначен для отмены незавершенного потока, и к нему предъявляются очень хитрые требования для его безопасного использования без утечек ресурсов.Это не полезно для потоков, которые выходят сами по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...