Когда Win32 InterlockedExchange должен функционировать использоваться?

Из документов:

dtype: тип данных, необязательный

Желаемый тип данных для массива. Если не указан, то тип будет определен как минимальный тип, необходимый для хранения объектов в последовательности. Этот аргумент может использоваться только для «upcast» массива. Для снижения рейтинга используйте метод .astype (t).

Итак, если вы установите dtype в качестве float64, все должно быть плавающим. Вы можете смешивать типы, но тогда вы не можете установить его как несоответствующий тип. Он будет использовать тип, который будет соответствовать всем данным, например, строка в случае array(['1', 'Foo', '3.123']).

19
задан EFrank 16 October 2008 в 13:59
поделиться

5 ответов

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

механизмы синхронизации Потока заботятся о синхронизации между ядрами, для получения дополнительной информации смотрят , http://blogs.msdn.com/oldnewthing/archive/2008/10/03/8969397.aspx или Google для получает и выпускает семантику

4
ответ дан 30 November 2019 в 03:59
поделиться

А также запись нового значения, InterlockedExchange также чтения и возвращает предыдущее значение; эта целая операция является атомарной. Это полезно для свободные от блокировок алгоритмы .

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

11
ответ дан 30 November 2019 в 03:59
поделиться

InterlockedExchange и запись и чтение - это возвращает предыдущее значение.

Это необходимо, чтобы гарантировать, что другой поток не записал другое значение сразу после того, как Вы сделали. Например, скажите, что Вы пытаетесь увеличить переменную. Можно считать значение, добавить 1, затем установить новое значение с InterlockedExchange. Значение, возвращенное InterlockedExchange, должно соответствовать значению, которое Вы первоначально читаете, иначе другой поток, вероятно, увеличил его одновременно, и необходимо циклично выполниться вокруг и попробовать еще раз.

10
ответ дан 30 November 2019 в 03:59
поделиться

Устанавливание 32-разрядного значения является атомарным, но только если Вы устанавливаете литерал.

b = 2 операций:

mov         eax,dword ptr [a] 
mov         dword ptr [b],eax 

Теоретически между первой и второй операцией могло быть некоторое прерывание.

3
ответ дан 30 November 2019 в 03:59
поделиться

Запись значения никогда не является атомарной по умолчанию. Когда Вы пишете значение в переменную, несколько машинных команд сгенерированы. С современными, приоритетными Ose ОС могла бы переключиться на другой поток между отдельными операциями записи.

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

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

3
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: