Java и C ++ 11 изменчивы - PullRequest
       31

Java и C ++ 11 изменчивы

3 голосов
/ 30 января 2012

Я бы хотел перенести часть кода с Java на C ++ 11, и я немного запутался с ключевым словом volatile.

Я не знаком с языком Java и не понимаю, что такое переменная volatile. Это гарантирует, что каждый поток имеет доступ к актуальному значению переменной - это изменчивое поведение C ++. Но обычно он используется для синхронизации - все ли действия выполняются над атомарной переменной volatile?

Так что я думаю, что C ++ 11 хорошей заменой Java volatile будет std :: atomic. Или я совершенно не прав, потому что пропустил некоторые дополнительные функции Java изменчивые?

Ответы [ 2 ]

6 голосов
/ 30 января 2012

Да, они подойдут, есть хорошая статья на эту тему в Доктор Доббс .

В двух словах, заказанные атомарные переменные безопасны для чтения и записи несколько потоков одновременно без какой-либо явной блокировки потому что они предоставляют две гарантии: их чтение и запись гарантированно выполняется в том порядке, в каком они появляются в вашей программе исходный код; и каждое чтение или запись гарантированно будут атомарными, все или ничего.

Java предоставляет этот тип переменной как volatile, C ++ как std::atomic.

1 голос
/ 30 января 2012

Эта страница содержит довольно хорошее объяснение ключевого слова volatile в Java: http://www.javamex.com/tutorials/synchronization_volatile.shtml. Мне кажется, что C ++ 11 std::atomic<> для примитивных типов (например, целых чисел) действительно является хорошей заменой. Обратите внимание, что std::atomic<> обеспечивает поддержку операций чтения-изменения-записи (например, compare_exchange_strong и fetch_add).

...