![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про многопоточность.
@!!ex © (2007-12-24 18:46:00)Чем грозит такая ситуация:
есть boolean массив.
есть дополнительный поток, который постоянно перебирается все элементы массива и меняет их значения.
Из основного потока периодически берутся значения массива.
Никакой синхронизации нет...
oxffff (2007-12-24 19:05:00) [41]
> @!!ex © (24.12.07 19:02) [7]
Представление памяти потоков запущенных на разных процессорах будет разным.
Memory Caching
When a processor writes to a memory location, the value is cached to improve performance. Similarly, the processor attempts to satisfy read requests from the cache to improve performance. Furthermore, processors begin to fetch values from memory before they are requested by the application. This can happen as part of speculative execution or due to cache line issues.
@!!ex (2007-12-24 19:04:00) [42]AV быть может или нет в данной ситуации?
Или это грозит только некорректностью данных?
oxffff (2007-12-24 19:02:00) [43]
> DiamondShark © (24.12.07 19:02) [5]
Читай мат. часть.
@!!ex (2007-12-24 19:02:00) [44]> Если просто меняешь,то на многопроцессорных машинах потенциально
> это может стать причиной некорретного поведения.
тоесть там может читаться в тоже время, когда писаться?
oxffff (2007-12-24 19:02:00) [45]
> @!!ex © (24.12.07 18:56) [2]
Решение - это обеспечение когерентности кэшей процессоров.
DiamondShark (2007-12-24 19:02:00) [46]Если главный поток только читает, а пишет только один доп. поток, то ничего страшного не произойдёт.
oxffff (2007-12-24 19:00:00) [47]
> @!!ex © (24.12.07 18:56) [2]
Открой SDK см. раздел Synchronization
Synchronization and Multiprocessor Issues
oxffff (2007-12-24 18:58:00) [48]
> @!!ex © (24.12.07 18:46)
Если просто меняешь,то на многопроцессорных машинах потенциально это может стать причиной некорретного поведения.
Решение использование InterlockedExchange
@!!ex (2007-12-24 18:56:00) [49]
procedure TKeys.Update;
var
Index:integer;
begin
GetKeyboardState(NewKeys);
for Index:=0 to 255 do
if NewKeys[Index] shr 7 <> OldKeys[Index] shr 7 then
Keys[Index]:=NewKeys[Index] shr 7 = 1;
CopyMemory(@OldKeys[0],@NewKeys[0],256);
end;
Я думаю может работать с отдельным массивом, а потом его копировать в основной?
ТОгда замена каждого жэлемента будет атомарной операцией?
oxffff (2007-12-24 18:55:00) [50]
> @!!ex © (24.12.07 18:46)
А как ты меняешь значения?