Int64 (long) и безопасность потоков - PullRequest
5 голосов
/ 02 августа 2010

Цитата из MSDN

Назначение экземпляра этого типа не является поточно-ориентированным на всех аппаратных платформах, поскольку двоичное представление этого экземпляра может быть слишком большим для назначения в одной атомарной операции.

Означает ли это, что Thead-safe на 64-битных процессорах, таких как Itianium или x86-64, также?

Например:

long data = GetData();
// some parallel task on data

Может быть проблема?

Ответы [ 5 ]

2 голосов
/ 03 августа 2010

Операции загрузки / сохранения в памяти считаются атомарными, если они выполняются на фрагментах памяти, которые размещены на выровненном адресе памяти и не больше, чем собственный указатель размера машины.
Значение, при 64-битной операции загрузки / сохраненияпо согласованному адресу памяти будет атомарным на 64-битной платформе, но не будет атомарным на 32-битной платформе.

Современные процессоры предлагают специальный набор инструкций (в .Net большинство из них доступны через класс Interlocked).которые позволяют достигать атомарности в операциях загрузки / хранения, которые больше, чем собственный размер указателя машины (64-битные операции на 32-битных процессорах и 128-битные операции на 64-битных процессорах. Последний не предоставляется классом Interlocked, но доступен внативный код).

Для получения более подробной информации, проверьте сообщение Джо Даффи: Потоковая безопасность, разрыв чтения и тому подобное .

2 голосов
/ 02 августа 2010

Возможно, но зачем вам писать программу, которая будет поточно-ориентированной на некоторых рабочих платформах Intel, но не на других?Обратите внимание, что типы Decimal и Double также имеют этот отказ от ответственности за безопасность потоков.

Microsoft рекомендует использовать блокировки в этих случаях.Здесь есть ссылки на полезную информацию о параллелизме, отображении памяти и низкоуровневых блокировках здесь:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f03ea3c9-4c2b-4a79-8f8c-4a6b7476b20d

0 голосов
/ 03 августа 2010

Суть дела в том, что Int64 не является гарантированным , чтобы быть атомным, но это не исключает его в некоторых случаях. Другими словами, Int64 будет атомарным в 64-битных системах. Конечно, это не означает, что это обязательно потокобезопасный. Есть и другие проблемы, связанные с безопасностью потоков, кроме атомарности. Например, чтобы избежать проблемы устаревания, вам придется использовать соответствующие директивы барьера памяти (volatile, Thread.VolatileWrite и т. Д.)

0 голосов
/ 02 августа 2010

Я бы ошибся на всякий случай и предположил, что нет.

Примечание это предыдущий вопрос.По сути, для атомарного присвоения Int64 вам следует использовать класс Interlocked .

Проверьте эту ссылку также для более подробного анализа.В частности, ознакомьтесь с разделом «Атомность и взаимосвязь».

0 голосов
/ 02 августа 2010

Это проблема, если к вашей переменной data обращаются напрямую через код из разных потоков.

Они не дают никаких гарантий в отношении какой-либо конкретной системы, поэтому, чтобы быть в безопасности, я бы предположил, что она не поточно-ориентирована как для систем x64, так и для x86, хотя я подозреваю, что они действительно имели в виду такие места, как компактный фреймворк, работающий на смартфоны.

...