Use of undefined thread ID

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

Описание

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

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

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

Риск

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

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

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

Зафиксировать

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

Примеры

расширить все

#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 не определено. Последующий вызов pthread_join использует это неопределенное значение.

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

Одной из возможных коррекций является вызов pthread_join с идентификатором потока в качестве аргумента только если 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 не проверяется. Если создание потока не удается, ошибка не обрабатывается. Возможно, неопределенный идентификатор потока позже используется в pthread_join функция.

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

Одним из возможных коррекций является использование идентификатора из создания потока, только если возврат значение из 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