Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C.
Объекты типа cnd_t
, mtx_t
, thrd_t
и tss_t
из Concurrency support library не должны иметь automatic или thread-local storage duration.
Доступ к объектам синхронизации обычно происходит из разных потоков. В таких случаях, при использовании automatic или thread-local storage duration программист рискует обратиться к объекту, у которого уже закончилось время жизни. Это приведёт к неопределённому поведению и неконтролируемому исполнению потоков. Данное диагностическое правило призвано уменьшить вероятность ошибки и исключить зависимость потоков от времени жизни объектов синхронизации.
Пример некорректного кода:
int Task1(void *mtx) { mtx_lock((mtx_t*)mtx); // can be dangling pointer // do stuff mtx_unlock((mtx_t*)mtx); // can be dangling pointer return 0; } void RunTask() { thrd_t thread1; mtx_t mtx; mtx_init(&mtx, mtx_plain); thrd_create(&thread1, Task1, &mtx); }
В приведённом выше синтетическом примере время жизни объекта mtx
может закончиться раньше, чем произойдёт его блокировка/разблокировка в дочернем потоке.
Корректный код:
thrd_t thread1; mtx_t mtx; int Task1(void *mtx) { mtx_lock((mtx_t*)mtx); // do stuff mtx_unlock((mtx_t*)mtx); return 0; } void RunTask() { mtx_init(&mtx, mtx_plain); thrd_create(&thread1, Task1, &mtx); }
Данная диагностика классифицируется как:
|