2016-11-29 3 views
5

У меня есть некоторый код, как следующее:C++ Нужен ли атомам массив атомных атомов?

KMessageQueue::KMessageQueue() 
{  
    messages = new atomic<KBuffer*>[MAX_MESSAGES]; 
    for (int i = 0; i < MAX_MESSAGES; i++) 
     messages[i].store(nullptr); 
} 

Где сообщения является членом KMessageQueue, определяется как:

std::atomic<KBuffer*>* messages; 

Таким образом, каждый элемент массива сообщений является атомарным, и я прочитал их от другой поток. Но сам ли указатель массива также должен быть атомарным? Может ли другой поток попытаться получить доступ к сообщению после завершения конструктора, только чтобы обнаружить, что сообщения еще не получили значение?

ответ

3

Но сам ли указатель массива также должен быть атомарным?

В общем, это зависит от того, как этот указатель используется различными потоками. Если один поток может изменить его, если другие (ы) читают, то да. В вашем случае нет, вам это не нужно. Предполагая, что ваша программа верна (в противном случае ответ не имеет никакого смысла), вы не можете использовать экземпляр своего класса, пока он не будет полностью построен, т.е. закончит конструктор.

Может ли другой поток попытаться получить доступ к сообщению после завершения конструктора, только чтобы обнаружить, что сообщения еще не получили значение?

Это ваша задача сделать этот класс недоступным для нескольких потоков, пока он не будет полностью инициализирован. После этого все должно быть хорошо.