Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top