Из документов:
dtype: тип данных, необязательный
Желаемый тип данных для массива. Если не указан, то тип будет определен как минимальный тип, необходимый для хранения объектов в последовательности. Этот аргумент может использоваться только для «upcast» массива. Для снижения рейтинга используйте метод .astype (t).
blockquote>Итак, если вы установите dtype в качестве float64, все должно быть плавающим. Вы можете смешивать типы, но тогда вы не можете установить его как несоответствующий тип. Он будет использовать тип, который будет соответствовать всем данным, например, строка в случае
array(['1', 'Foo', '3.123'])
.
В многопроцессорной или многоядерной машине каждое ядро имеет свой собственный кэш - таким образом, каждое ядро имеет каждое собственное потенциально различное "представление" того, каково содержание системной памяти.
механизмы синхронизации Потока заботятся о синхронизации между ядрами, для получения дополнительной информации смотрят , http://blogs.msdn.com/oldnewthing/archive/2008/10/03/8969397.aspx или Google для получает и выпускает семантику
А также запись нового значения, InterlockedExchange
также чтения и возвращает предыдущее значение; эта целая операция является атомарной. Это полезно для свободные от блокировок алгоритмы .
(Кстати, 32-разрядные записи, как гарантируют, не будут атомарными. Рассмотрите случай, где запись не выравнивается и колеблется между границей кэша, например.)
InterlockedExchange
и запись и чтение - это возвращает предыдущее значение.
Это необходимо, чтобы гарантировать, что другой поток не записал другое значение сразу после того, как Вы сделали. Например, скажите, что Вы пытаетесь увеличить переменную. Можно считать значение, добавить 1, затем установить новое значение с InterlockedExchange
. Значение, возвращенное InterlockedExchange
, должно соответствовать значению, которое Вы первоначально читаете, иначе другой поток, вероятно, увеличил его одновременно, и необходимо циклично выполниться вокруг и попробовать еще раз.
Устанавливание 32-разрядного значения является атомарным, но только если Вы устанавливаете литерал.
b = 2 операций:
mov eax,dword ptr [a]
mov dword ptr [b],eax
Теоретически между первой и второй операцией могло быть некоторое прерывание.
Запись значения никогда не является атомарной по умолчанию. Когда Вы пишете значение в переменную, несколько машинных команд сгенерированы. С современными, приоритетными Ose ОС могла бы переключиться на другой поток между отдельными операциями записи.
Это - еще больше проблема на многопроцессорных машинах, где несколько потоков могли выполняться одновременно и пытаться записать в единственную ячейку памяти одновременно.
Взаимно блокируемые операции избегают этого при помощи специализированных инструкций сделать запись (x86, выделил инструкции для этого вида ситуации), которые делают read-modify-write в одной инструкции. Эти инструкции также блокируют шину памяти всех процессоров, чтобы гарантировать, что никакой другой поток выполнения не мог писать в значение одновременно.