Mutex vs Критическая секция

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cupper, 9 Feb 2011.

  1. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    именно так, и в названии я не опечатался.

    Был мне задан сегодня вопрос, о том знаком ли я с многопоточность, и далее когда речь зашла об объектах синхронизации, я замялся, и сказал ну мол знаю мютексы, семафоры мол не юзал, делаем мы мол значит критическую секцию и ее выполняет только один поток. На что мне был задан вопрос, а в чем отличие мютекса от критической секции... и я озадачился. Я было начал о том что с помощью мютексов эта самая критическая секции и ограничивается (перед этим упоминал что в С++ многопоточность почти не юзал, но было дело в С#), мне в отчет что, в С# оно наверно так и есть... и на этом разговор закончился.

    Но непонятка то осталась, притом не хилая. Я быстро в гугл, что бы освежить свои знания (прям пару недель назад только pthread изучал), ввожу в запрос сразу C++ критические сеции... и получаю
    http://www.cyberguru.ru/programming/cpp/multithreading-intro-page2.html

    после чего немного собрав мысли в кучу, всетаки утвердился в мысли что в POSIX как бы нет такого обхекта как критическая сеции, и это непосредственно логическое название того куска кода которые ограничивается мютексами для выполнения в единичном экземпляре. А вот в виндовских приблудах оказывается есть конкретное разделение объектов синхронизации на критическии секции и мютексы...

    и того имеем
    pthread
    основной объект синхронизации mutex, работает в пределах одного процесса
    Windiws потоки
    CRITICAL_SECTION как мютекс, но работает быстрей мютекса и в пределах одного потока
    mutex как такового класса нет, можно только полчить хендел на него, вызвав функцию
    Code:
    HANDLE hMutex;
    hMutex = CreateMutex( NULL, FALSE, NULL );
    работает между процессами
    boost::thread
    заполните сами плиз, нужно для целостности картины :)
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Мьютексы позволяют контролировать состояние некоторой переменной и разграничивать к ней доступ сразу нескольких потоков, давая доступ только одному потоку единовременно, семафоры позволяют делать то же самое, но могут дать доступ к этой переменной сразу нескольким выбранным потокам, критические секции позволяют разграничить часть кода, которая должна выполняться только одним потоком. Существует еще TLS. Про все это прекрасно можно почитать в гугле.

    Вот из вики:
    В Win как отдельные объекты есть и мьютексы, и семафоры, и TLS, и критические секции, и ивенты, и функции для interlocked-обмена данными, еще появились условные переменные (condition variables). Про всё это есть тут: http://msdn.microsoft.com/en-us/library/ms681924%28v=VS.85%29.aspx
    А еще можно делать глобальные ивенты и мьютексы для синхронизации процессов.
     
    #2 GRRRL Power, 10 Feb 2011
    Last edited: 10 Feb 2011
  3. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    836
    Reputations:
    402
    если не выпендриваться с терминологией то мутексы позволяют поставить в системе глобальный "именованный флаг", при этом проверить - установлен этот флаг или нет - может любая программа в системе.
    Т.е. с помощью мутексов могут взаимоействовать даже разные программы, а не только потоки 1 проги.
    (Я, например, использую мутексы для того, чтобы не позволять одновременного запуска нескольких копий отдельных моих программ, при этом в момент запуска программа проверяет, не установлен ли мутекс с заранее заданным именем, и если нет- то ставит его. Соответственно бльше ни одна копия программы дальше проверки мутекса - не зайдет.
    Особенно это полезно, если программа автозапускается по расписанию, но при этом существования более чем одной её копии в памяти одновременно - не требуется. Малварщики возможно поймут о чем я)

    Ну а крит секция - просто предотвращает выполнение какого-то куска кода одновременно несколькими потоками в пределах одной программы.

    Отмечу - в учебники по мутексам и крит секциям я особа не вчитывался и в терминологию особа не вдумывался, но зато в работе я это счастье использую в каждой софтине, потому просто описал то как вижу мутексы сам для себя-)

    Семафоры, как я пнимаю, это крит секции, но не "на одного" а "на нескольких", но юзать их пока что в софте не доводилось
     
    #3 ErrorNeo, 10 Feb 2011
    Last edited: 10 Feb 2011
    1 person likes this.
  4. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    как ? мютекс можно только захватить и отпустить (концептуально).

    Вот фраза
    и сбивает меня с толку.

    Я было подумал что возможно в Win потоках и POSIX мютексы это разные вещи. Поэтому и поставил в начале вопрос относительно разных реализаций многопоточных библиотек.

    Но по сути для всех оно вот так
    По сути неважно что для вин что для линь должны быть объекты синхронизации между процессами, и между потоками (более быстрые).
    В Win это четко выражено в объекты типа CRITICAL_SECTION и Мютексы (разработчики решили без выепонов новых типов работать с ними просто через HANDLE, с чего бы это ?)

    Но вот в pthread во всех обучающих курсах по pthread сразу идет рассмотрению именно Mutex'ов, и я до сих пор так и не нашел то что легковестней них и только между потоками.
     
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я ничего не могу сказать насчет nix. Насчет Win я немного оговорился, мьютекс можно действительно захватить и отпустить, как и критическую секцию, просто критическая секция в Win рассматривается именно как средство для контроля определенного участка кода, чтобы только один поток мог его исполнять единовременно, а мьютекс (как и семафор) - как некоторый объект, у которого можно проверить состояние (захвачен/не захвачен). Создается он в виде HANDLE он для того, чтобы мог работать с WaitForSingleObject/WaitForMultipleObjects. В Win мьютекс может быть как локальным, так и глобальным.
     
  6. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    разве объект критическая секция не предоставляет API для того что бы проверить состояние ? TryEnterCriticalSection.

    Тогда получается ты опять неверно свою мысль выразил. Или я тебя не понял, и разница между критической секицией и мютексом много более того что первая только среди нитей, а второй также и среди процессов.
     
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Получается, что по своей сути мьютекс и критическая секция в Windows не отличаются. Правда, с помощью WaitForSingleObject можно проверить состояние мьютекса с заданным таймаутом, чего TryEnterCriticalSection не позволяет сделать. WaitForMultipleObjects позволяет отслеживать состояние сразу нескольких мьютексов.
     
  8. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Крит.секции в отличие от мьютексов не являются объектами ядра ОС, им не нужно тратить время на переключение контекстов потоков из режима юзера в режим ядра.
     
  9. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    ну вот поэтому они и работают быстрей и используются только для нитей.

    PS. теперь меня еще интересует наличие объекта аналогичного критической секции в pthread и в boost::thread, рано и поздно я дойду до этого сам, боюсь будет поздно :)
     
    #9 cupper, 10 Feb 2011
    Last edited: 10 Feb 2011
  10. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    В pthread мьютексы аналогичны крит.секциям win. Насколько я помню, они тоже в контексте только одного процесса работают.
     
  11. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    это частично проясняет ситуацию для pthread

    PS. но сразу встает вопрос о сложности использования, мол разделяемую память над иметь, да еще и сам процесс этого сложен и мало описан. В противопоставление имеем виндовс потоки который разделил два сих понятия, правда о сложностях использования виндовских мютексов между разными потоками я вообще информации пока не имею. Но там они как объекты ядра, поэтому с одной стороны нет заморочек с разделяемой пмятью, с другой это медленно.

    Еще один коварный вопрос, в pthread мютексы же ведь не являются объектов ядра. По этому с одной стороны юзать их легко (процессозагруженность минимум) с другой, это вытекает в проблему использования между процессами.
     
    #11 cupper, 11 Feb 2011
    Last edited: 11 Feb 2011
  12. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Мютекс - это абстракция, созданная для синхронизации потоков.
    Более конкретно мютекс - это двоичный семафор.
    Семафор - это это особы тип разделяемой переменной, которую обрабатывает только две функции .
    P(s):<await (s>0) s=s-1>
    V(s):<s=s+1>
    Где <operation> - operation воспринимается как атомарная операция(без <> как обычная).
    Оператор await (B) S ждёт истиности условия B после чего выполняется S.

    Мютекс это s
    P(s):<await (s) s=false>
    V(s):<s=true>

    Def критической секции.
    Mutex x;
    P(x);
    //Critical Section
    V(x);

    P.S. Информация взята из Грегори Р. Эндрюс - Основы многопоточного, параллельного и распределенного программирования.
    В свое время готовился к экз. по этой книге.
     
    #12 Irdis, 11 Feb 2011
    Last edited: 11 Feb 2011
  13. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Мьютексы - для синхронизации потоков разных приложений.
    Критические секции - для синхронизации потоков одного приложения.
    Критические секции работают быстрее, чем мьютексы.
    Это для Windows.
     
    1 person likes this.