volatile ключова дума за обекти в C++

Имам обект, безопасен за нишка (това е клас, който използва std::atomic load() и store()) като един от членовете на класа. Нишка 1 увеличава брояча, а нишка 2 чете брояча.

Обикновено примитивните типове ( int и т.н.), които се споделят от различни нишки, се обявяват за непостоянни, за да се предотврати всякаква оптимизация на компилатора. Трябва ли да декларирам този безопасен за нишка брояч обект, който се споделя от 2 различни нишки като непостоянен?

Може ли някой да даде повече представа за това?


person KodeWarrior    schedule 12.03.2013    source източник


Отговори (2)


Не. Няма нужда, ако обектът е деклариран като атомен.

Компилаторът на C или C++ не може да пренарежда четенията и записите в местоположения с енергонезависима памет, нито може да пропуска четене или запис в местоположение с летлива памет.

Използвайки atomic, той вече постига това, което volatile е възнамерявал да направи, така че няма нужда да декларирате volatile.

person zzk    schedule 12.03.2013
comment
искаш ли да кажеш, че е достатъчно, ако обектите изпълняват атомни операции? - person KodeWarrior; 13.03.2013
comment
доста се съмнявам. Мисля, че atomic не гарантира предотвратяване на оптимизацията на компилатора. - person KodeWarrior; 13.03.2013
comment
@KodeWarrior наистина ли имаш представа за атомната операция? вашият обект е защитен от mutex, как може компилаторът да оптимизира защитата на mutex... - person zzk; 13.03.2013
comment
Имам добра представа за атомната работа. Ето защо смятам, че твърдението ти е грешно! Ако променливата е разпределена в регистъра, въпреки че операцията е атомарна, четенията/записите от друга нишка няма да бъдат отразени. - person KodeWarrior; 13.03.2013
comment
@KodeWorrior: std:atomic в C++ също премахва оптимизациите на компилатора, погледнете msdn.microsoft.com/en-us/library/vstudio/hh874894.aspx - person Sil; 13.03.2013

Разгледайте: статия за volatile (C++) msdn

Не е нужно, защото

  • „Нестабилната ключова дума в стандартния код на C++11 ISO трябва да се използва само за хардуерен достъп; не я използвайте за комуникация между нишки. За комуникация между нишки използвайте механизми като std::atomic от стандартния шаблон на C++ Библиотека."
person Sil    schedule 12.03.2013