Прочитал в одной статье про средства синхронизации http://www.sofmos.com/lyosha/Articles/multithreading4.html. Меня конкретно заинтересовали атомарные операции. Там говорится, что они поддерживаются на уровне железа. Т. е. можно одной командой увеличить значение счётчика, а мне как раз это нужно, потому что пишу программу и у меня есть массив счётчиков. Программа многопоточная, и может возникнуть тиакая ситуация, что 1 поток считает значение счётчика, увеличит, но не успеет его записать и ОС прервёт его в это время, а другой поток может обратиться к этому счётчику, считать его, увеличить, записать, но потом второй поток возобновится и запишет своё значение, и получится, что счётчик увеличился на 1, а не на 2, как должно было быть. Но проблема в том, что функции, которые описываются в статье (например InterlockedIncrement), для си, но раз они поддерживаются на уровне железа, то должны быть инструкции ассемблера. Может кто знает их?
InterlockedIncrement: Код (Text): 7C8097B6 k>/$ 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4] 7C8097BA |. B8 01000000 MOV EAX,1 7C8097BF |. F0:0FC101 LOCK XADD DWORD PTR DS:[ECX],EAX <-! 7C8097C3 |. 40 INC EAX 7C8097C4 \. C2 0400 RETN 4
Люди, в образовательных целях объясните, почему так сложно? А почему нельзя сделать просто инкремент в памяти, ведь его нельзя прервать? Или это для многоядерного случая?
Dmitry_Milk Если процессор многоядерный, то гарантировать корректность данных можно только используя префикс LOCK - он полностью блокирует шину на время выполнения данной операции. "In a multiprocessor environment, the LOCK# signal ensures that the processor has exclusive use of any shared memory while the signal is asserted."