Атомарные операции

Discussion in 'WASM.BEGINNERS' started by Victor_S, Nov 4, 2011.

  1. Victor_S

    Victor_S New Member

    Blog Posts:
    0
    Joined:
    Oct 28, 2011
    Messages:
    28
    Прочитал в одной статье про средства синхронизации http://www.sofmos.com/lyosha/Articles/multithreading4.html. Меня конкретно заинтересовали атомарные операции. Там говорится, что они поддерживаются на уровне железа. Т. е. можно одной командой увеличить значение счётчика, а мне как раз это нужно, потому что пишу программу и у меня есть массив счётчиков. Программа многопоточная, и может возникнуть тиакая ситуация, что 1 поток считает значение счётчика, увеличит, но не успеет его записать и ОС прервёт его в это время, а другой поток может обратиться к этому счётчику, считать его, увеличить, записать, но потом второй поток возобновится и запишет своё значение, и получится, что счётчик увеличился на 1, а не на 2, как должно было быть. Но проблема в том, что функции, которые описываются в статье (например InterlockedIncrement), для си, но раз они поддерживаются на уровне железа, то должны быть инструкции ассемблера. Может кто знает их?
     
  2. Hellspawn

    Hellspawn New Member

    Blog Posts:
    0
    Joined:
    Feb 4, 2006
    Messages:
    310
    Location:
    Москва
    InterlockedIncrement:
    Code (Text):
    1. 7C8097B6 k>/$  8B4C24 04       MOV ECX,DWORD PTR SS:[ESP+4]
    2. 7C8097BA   |.  B8 01000000     MOV EAX,1
    3. 7C8097BF   |.  F0:0FC101       LOCK XADD DWORD PTR DS:[ECX],EAX <-!
    4. 7C8097C3   |.  40              INC EAX
    5. 7C8097C4   \.  C2 0400         RETN 4
     
  3. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    Но если не нужно полученное значение счётчика, то можно и одним lock inc dword[addr] обойтись.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Blog Posts:
    0
    Joined:
    Nov 20, 2007
    Messages:
    540
    Люди, в образовательных целях объясните, почему так сложно?
    А почему нельзя сделать просто инкремент в памяти, ведь его нельзя прервать? Или это для многоядерного случая?
     
  5. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Blog Posts:
    0
    Joined:
    Oct 15, 2010
    Messages:
    345
    Location:
    Sliven, Bulgaria
    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."