Использование std::ios_base::pword() потокобезопасным способом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование std::ios_base::pword() потокобезопасным способом?

Сообщение Anonymous »

Я хочу использовать pword() для хранения дополнительного объекта с любым потоком, но потокобезопасным способом, а именно для выделения ровно одного экземпляр объекта в первый раз для данного потока. Поскольку void*, на который ссылается pword(), не является атомарным и, следовательно, не может использовать функцию сравнения-обмена, я считаю, что мне придется использовать блокировку с двойной проверкой и барьерами памяти. Используя это в качестве отправной точки, у меня есть:

Код: Выделить всё

class my_obj { /* ... */ };

my_obj* get_obj_for( std::ios_base &b ) {
static int const index = ios_base::xalloc();
void *p = b.pword( index );
std::atomic_thread_fence( std::memory_order_acquire );
if ( p == nullptr ) {
static std::mutex mutex;
std::lock_guard lock{ mutex };
p = b.pword( index );
if ( p == nullptr ) {
p = new my_obj;
std::atomic_thread_fence( std::memory_order_release );
b.pword( index ) = p;
}
}
return static_cast( p );
}
Однако в примере «Использование ограждений получения и освобождения C++11», приведенном в этой статье, его указатель m_instance равен std::atomic. Будет ли мой приведенный выше код по-прежнему потокобезопасным, даже если void*, на который ссылается pword(), не std::atomic? Если нет, есть ли способ сделать код потокобезопасным?


Подробнее здесь: https://stackoverflow.com/questions/782 ... d-safe-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»