﻿# V2670\. MISRA\. Thread objects, thread synchronization objects, and thread\-specific storage pointers should only be accessed by the appropriate Standard Library functions\.

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

Правило актуально только для языка С\.

Доступ к объектам потока исполнения \(`thrd_t`\), мьютексам \(`mtx_t`\), условным переменным \(`cnd_t`\) и специфичным для потоков хранилищам \(`tss_t`\) должен осуществляться исключительно через специальные функции, предоставляемые стандартной библиотекой:

* для `thrd_t`: [`thrd_create`](https://en.cppreference.com/w/c/thread/thrd_create.html), [`thrd_detach`](https://en.cppreference.com/w/c/thread/thrd_detach.html), [`thrd_join`](https://en.cppreference.com/w/c/thread/thrd_join.html), [`thrd_equal`](https://en.cppreference.com/w/c/thread/thrd_equal.html), [`thrd_current`](https://en.cppreference.com/w/c/thread/thrd_current.html), [`thrd_sleep`](https://en.cppreference.com/w/c/thread/thrd_sleep.html), [`thrd_yield`](https://en.cppreference.com/w/c/thread/thrd_yield.html), [`thrd_exit`](https://en.cppreference.com/w/c/thread/thrd_exit.html);
* для `mtx_t`: [`mtx_init`](https://en.cppreference.com/w/c/thread/mtx_init.html), [`mtx_lock`](https://en.cppreference.com/w/c/thread/mtx_lock.html), [`mtx_trylock`](https://en.cppreference.com/w/c/thread/mtx_trylock.html), [`mtx_timedlock`](https://en.cppreference.com/w/c/thread/mtx_timedlock.html), [`mtx_unlock`](https://en.cppreference.com/w/c/thread/mtx_unlock.html), [`mtx_destroy`](https://en.cppreference.com/w/c/thread/mtx_destroy.html);
* для `cnd_t`: [`cnd_init`](https://en.cppreference.com/w/c/thread/cnd_init.html), [`cnd_signal`](https://en.cppreference.com/w/c/thread/cnd_signal.html), [`cnd_broadcast`](https://en.cppreference.com/w/c/thread/cnd_broadcast.html), [`cnd_wait`](https://en.cppreference.com/w/c/thread/cnd_wait.html), [`cnd_timedwait`](https://en.cppreference.com/w/c/thread/cnd_timedwait.html), [`cnd_destroy`](https://en.cppreference.com/w/c/thread/cnd_destroy.html);
* для `tss_t`: [`tss_create`](https://en.cppreference.com/w/c/thread/tss_create.html), [`tss_get`](https://en.cppreference.com/w/c/thread/tss_get.html), [`tss_set`](https://en.cppreference.com/w/c/thread/tss_set.html), [`tss_delete`](https://en.cppreference.com/w/c/thread/tss_delete.html)\.

Прямой доступ к членам структур, их копирование, модификация или сравнение любыми другими способами приводят к неопределённому поведению\.

Рассмотрим пример:

```cpp
thrd_t thread1, thread2;

int threads_equal(const thrd_t *t1, const thrd_t *t2)
{
  return memcmp(t1, t2, sizeof(thrd_t));
}
```

Функция `memcmp` выполняет побайтовое сравнение двух объектов типа `thrd_t`\. Однако программист может не знать, каким именно образом поток исполнения будет реализован в той или иной стандартной библиотеке C\. Это может привести к тому, что два одинаковых потока могут считаться различными, например, из\-за байтов выравнивания\.

Для корректного сравнения объектов типа `thrd_t` и написания переносимого кода следует использовать функцию `thrd_equal`:

```cpp
int threads_equal(const thrd_t *t1, const thrd_t *t2)
{
  return thrd_equal(t1, t2);
}
```