Есть ли способ в c ++ 11, чтобы предотвратить "нормальные" операции от скольжения до или после атомарной операции - PullRequest
0 голосов
/ 17 сентября 2011

Я заинтересован в том, чтобы сделать что-то вроде (однопотоковое обновление, многопотоковое чтение banneedURLs):

atomic<bannedURLList*> bannedURLs;//global variable pointing to the currently used instance of struct
void  updateList()
{
       //no need for mutex because only 1 thread updates
       bannedURLList* newList= new bannedURLList();
       bannedURLList* oldList=bannedURLs;
       newList->initialize();
       bannedURLs=newList;// line must be after previous line, because list must be initialized before it is ready to be used

      //while refcnt on the oldList >0 wait, then delete oldList;
}

потоки читателя делают что-то вроде этого:

{
   bannedURLs->refCnt++;
   //use bannedURLs
   bannedURLs->refCnt--;
}

struct memeber refCntтакже является атомным целым числом. Мой вопрос: как предотвратить переупорядочение этих двух строк:

newList->initialize();
bannedURLs=newList;

Можно ли это сделать в std :: way?

1 Ответ

1 голос
/ 17 сентября 2011

Используйте bannedURLs.store(newList); вместо bannedURLs=newList;. Поскольку вы не передали слабый спецификатор заказа, это вызывает полный заказ в магазине.

...