запись в std :: atomic после преобразования в char * - PullRequest
2 голосов
/ 24 июня 2019

Извините, если мои сомнения слишком наивны. Но у меня есть трудности с типизацией std::atomic до char* типа. Является ли кастинг с std::atomic to char действительным?

Могу ли я написать приведенную переменную такого типа Я уверен, что не будет многопоточного чтения / записи, пока поток пытается записать в переменную.

std::atomic<uint8_t>* data_;
char *data = reinterpret_cast<char*>(data_);
*data |= mask;

Насколько это безопасно?

EDIT: Я не уверен, стоит ли упоминать. В моем коде

char *raw;
// variable raw is allocated
std::atomic<uint8_t>* data_ = reinterpret_cast<std::atomic<uint8_t>*>(raw);

Выше показано, как создается std::atomic< uint8_t> (как тип и тип, приведенные к типу std :: atomic).

Спасибо:)

1 Ответ

5 голосов
/ 24 июня 2019

Я не думаю, что это вообще безопасно. Стандарт C ++ не гарантирует, что std::atomic<uint8_t> будет без блокировки . Если это не так, то может быть, например, переменная-член mutex , сохраненная в каждом объекте std::atomic<uint8_t>, начиная с его первого байта. В таком случае ваша команда *data |= mask; будет немного манипулировать этим мьютексом, что может полностью нарушить его внутреннюю реализацию.


Это также может быть актуальный вопрос: Можно ли получить адрес базового хранилища для atomic_int? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...