Синхронизация потоков

Тема в разделе "WASM.BEGINNERS", создана пользователем Quark, 29 сен 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Вобщем есть у меня функция, которая должна выполняться только в одном потоке. Причём если её вызывают несколько потоков, то они доджны ожидатьпока завершится предидущий. я сделал примерно следующее:

    Код (Text):
    1. ULONG Mutex;
    2.  
    3. void func()
    4. {
    5. while (Mutex) Sleep(50);
    6.  Mutex = 1;
    7. ...
    8.  Mutex = 0;
    9.  return;
    10. }
    Но в данном случае потоки могут вызывать её не по порядку. то есть нужно, чтобы выполнялся первым тот поток, который первый её вызвал.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    используй критические секции
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    If multiple threads call EnterCriticalSection, and the critical section is currently owned by a different thread, the highest priority thread among the calling threads gets the critical section first after the current thread leaves the critical section. If all the calling threads have the same priority, a first-in, first-out (FIFO) basis is used after the current thread leaves the critical section.

    Quark
    Так что сам думай, подойдут ли тебе они.
     
  4. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    CRITICALSECTION CRITICAL_SECTION <?> ;структура критической секции

    invoke InitializeCriticalSection,offset CRITICALSECTION;создание критической секции (при запуске проги)
    invoke DeleteCriticalSection,offset CRITICALSECTION ;удалоить критическую секцию (при закрытии)

    invoke EnterCriticalSection,offset CRITICALSECTION;вход в критическую секцию (с этого момента работает тока один поток)
    invoke LeaveCriticalSection,offset CRITICALSECTION;выходи из критической секции (до этого момента)