одновременная модификация битов в целом числе - PullRequest
0 голосов
/ 09 ноября 2010

Я хочу знать, если я попытаюсь установить биты внутри символа / целого числа из нескольких потоков, потеряю ли я какую-либо модификацию?Сначала у меня будут все нули, а для потоков будет только 1. Архитектура системы x64.

Спасибо, Гокул.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

На x64 (и x86) операции над целыми числами являются атомарными. Это означает, что чтение и запись являются независимо атомарными, а не в комбинации. (Например, если у вас два потока пишут целое число одновременно, вы не увидите половину одного и половины другого - вы всегда увидите одно полное целое или другое.)

Однако чтение и запись - это две отдельные операции. Вы можете выполнить некоторые операции с блокировкой (в результате чего чтение и запись будут одной атомарной операцией), но я не верю, что побитовая логика попадает в набор операций, которые можно выполнить таким образом.

Я думаю, вам придется заблокировать какой-нибудь мьютекс / монитор и выполнить чтение / запись, если вы хотите, чтобы эта операция была атомарной.

1 голос
/ 09 ноября 2010

Вы должны использовать мьютекс или аналогичный механизм синхронизации, или атомарную операцию. Для первых есть библиотеки POSIX и Windows, легко доступные и очень стандартные. В последнем случае большинство компиляторов предоставляют некоторые функции (например, http://gcc.gnu.org/wiki/Atomic), режим встроенной сборки или другой удобный способ их использования), и вы всегда можете вернуться к ссылке на объект, скомпилированный из языка ассемблера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...