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

Тема в разделе "WASM.BEGINNERS", создана пользователем Victor_S, 4 ноя 2011.

  1. Victor_S

    Victor_S New Member

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

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    InterlockedIncrement:
    Код (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

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Но если не нужно полученное значение счётчика, то можно и одним lock inc dword[addr] обойтись.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

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

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    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."