﻿# V2640\. MISRA\. Thread objects, thread synchronization objects and thread\-specific storage pointers should have appropriate storage duration\.

Данное диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\.

Объекты типа `cnd_t`, `mtx_t`, `thrd_t` и `tss_t` из [Concurrency support library](https://en.cppreference.com/w/c/thread) не должны иметь automatic или thread\-local [storage duration](https://pvs-studio.ru/ru/blog/terms/6564/)\.

Доступ к объектам синхронизации обычно происходит из разных потоков\. В таких случаях, при использовании automatic или thread\-local storage duration программист рискует обратиться к объекту, у которого уже закончилось [время жизни](https://en.cppreference.com/w/cpp/language/lifetime)\. Это приведёт к неопределённому поведению и неконтролируемому исполнению потоков\. Данное диагностическое правило призвано уменьшить вероятность ошибки и исключить зависимость потоков от времени жизни объектов синхронизации\.

Пример некорректного кода:

```cpp
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` может закончиться раньше, чем произойдёт его блокировка/разблокировка в дочернем потоке\.

Корректный код:

```cpp
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);
}
```