Use of undefined thread ID

Распараллельте ID от не пройдено создания потока, используемого в последующих функциях потока

Описание

Этот дефект происходит, когда создание потока функционирует, такие как pthread_create сбои, но вы продолжаете использовать ID от создания потока.

Например, pthread_join использует неопределенный ID потока после того, как создание предыдущего сообщения перестало работать. Ненулевое возвращаемое значение от pthread_create указывает на не пройдено создание потока.

pthread_t id;
if(0! = pthread_create(&id, attr, start_func, NULL)) {
    ...
    phread_join(id, NULL);
    ...
}
Проблема также отмечается, если вы не проверяете возвращаемое значение от вызова до pthread_create.

Риск

Согласно стандарту POSIX®, если создание потока перестало работать, содержимое ID потока не определено. Использование неопределенного ID потока может привести к непредсказуемым результатам.

Проблема часто указывает на программную ошибку. Например, возможно, что вы протестировали на ненулевые значения, чтобы определить успешное создание потока:

if(0 != pthread_create(&id, attr, start_func, NULL))
вместо нуля:
if(0 == pthread_create(&id, attr, start_func, NULL))

Фиксация

Если использование неопределенного ID потока прибывает из программной ошибки, зафиксируйте ошибку. В противном случае удалите функции потока, которые используют неопределенный ID.

Примеры

развернуть все

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);


int main() {
    pthread_t id;
    if(thread_success != pthread_create(&id, NULL, thread_func, NULL)) {
         if(thread_success == pthread_join(id, NULL)) {
         }
    }

    return 0;
}

В этом примере, если pthread_create возвращает ненулевое значение, создание потока перестало работать. Значение *id isundefined. Последующий вызов pthread_join использование это неопределенное значение.

Коррекция – потоки соединения после успешного создания потока

Одна возможная коррекция должна вызвать pthread_join с ID потока в качестве аргумента, только если pthread_create возвращает нуль.

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);


int main() {
    pthread_t id;
    if(thread_success == pthread_create(&id, NULL, thread_func, NULL)) {
         if(thread_success == pthread_join(id, NULL)) {
         }
    }

    return 0;
}
#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);


int main() {
    pthread_t id;
    pthread_create(&id, NULL, thread_func, NULL); 
    if(thread_success == pthread_join(id, NULL)) {
    }

    return 0;
}

В этом примере, возвращаемом значении pthread_create не проверяется. Если создание потока перестало работать, ошибка не становится обработанной. Возможно неопределенный ID потока позже используется в pthread_join функция.

Коррекция – обрабатывает ошибки от создания потока

Одна возможная коррекция должна использовать ID от создания потока только если возвращаемое значение от pthread_create указывает на успешное создание потока.

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);


int main() {
    pthread_t id;
    if(thread_success == pthread_create(&id, NULL, thread_func, NULL)) {
         if(thread_success == pthread_join(id, NULL)) {
         }
    }

    return 0;
}

Проверяйте информацию

Группа: параллелизм
Язык: C
Значение по умолчанию: 'off'
Синтаксис командной строки: UNDEFINED_THREAD_ID
Удар: носитель

Введенный в R2019b