именно так, и в названии я не опечатался. Был мне задан сегодня вопрос, о том знаком ли я с многопоточность, и далее когда речь зашла об объектах синхронизации, я замялся, и сказал ну мол знаю мютексы, семафоры мол не юзал, делаем мы мол значит критическую секцию и ее выполняет только один поток. На что мне был задан вопрос, а в чем отличие мютекса от критической секции... и я озадачился. Я было начал о том что с помощью мютексов эта самая критическая секции и ограничивается (перед этим упоминал что в С++ многопоточность почти не юзал, но было дело в С#), мне в отчет что, в С# оно наверно так и есть... и на этом разговор закончился. Но непонятка то осталась, притом не хилая. Я быстро в гугл, что бы освежить свои знания (прям пару недель назад только 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 заполните сами плиз, нужно для целостности картины
Мьютексы позволяют контролировать состояние некоторой переменной и разграничивать к ней доступ сразу нескольких потоков, давая доступ только одному потоку единовременно, семафоры позволяют делать то же самое, но могут дать доступ к этой переменной сразу нескольким выбранным потокам, критические секции позволяют разграничить часть кода, которая должна выполняться только одним потоком. Существует еще TLS. Про все это прекрасно можно почитать в гугле. Вот из вики: В Win как отдельные объекты есть и мьютексы, и семафоры, и TLS, и критические секции, и ивенты, и функции для interlocked-обмена данными, еще появились условные переменные (condition variables). Про всё это есть тут: http://msdn.microsoft.com/en-us/library/ms681924%28v=VS.85%29.aspx А еще можно делать глобальные ивенты и мьютексы для синхронизации процессов.
если не выпендриваться с терминологией то мутексы позволяют поставить в системе глобальный "именованный флаг", при этом проверить - установлен этот флаг или нет - может любая программа в системе. Т.е. с помощью мутексов могут взаимоействовать даже разные программы, а не только потоки 1 проги. (Я, например, использую мутексы для того, чтобы не позволять одновременного запуска нескольких копий отдельных моих программ, при этом в момент запуска программа проверяет, не установлен ли мутекс с заранее заданным именем, и если нет- то ставит его. Соответственно бльше ни одна копия программы дальше проверки мутекса - не зайдет. Особенно это полезно, если программа автозапускается по расписанию, но при этом существования более чем одной её копии в памяти одновременно - не требуется. Малварщики возможно поймут о чем я) Ну а крит секция - просто предотвращает выполнение какого-то куска кода одновременно несколькими потоками в пределах одной программы. Отмечу - в учебники по мутексам и крит секциям я особа не вчитывался и в терминологию особа не вдумывался, но зато в работе я это счастье использую в каждой софтине, потому просто описал то как вижу мутексы сам для себя-) Семафоры, как я пнимаю, это крит секции, но не "на одного" а "на нескольких", но юзать их пока что в софте не доводилось
как ? мютекс можно только захватить и отпустить (концептуально). Вот фраза и сбивает меня с толку. Я было подумал что возможно в Win потоках и POSIX мютексы это разные вещи. Поэтому и поставил в начале вопрос относительно разных реализаций многопоточных библиотек. Но по сути для всех оно вот так По сути неважно что для вин что для линь должны быть объекты синхронизации между процессами, и между потоками (более быстрые). В Win это четко выражено в объекты типа CRITICAL_SECTION и Мютексы (разработчики решили без выепонов новых типов работать с ними просто через HANDLE, с чего бы это ?) Но вот в pthread во всех обучающих курсах по pthread сразу идет рассмотрению именно Mutex'ов, и я до сих пор так и не нашел то что легковестней них и только между потоками.
Я ничего не могу сказать насчет nix. Насчет Win я немного оговорился, мьютекс можно действительно захватить и отпустить, как и критическую секцию, просто критическая секция в Win рассматривается именно как средство для контроля определенного участка кода, чтобы только один поток мог его исполнять единовременно, а мьютекс (как и семафор) - как некоторый объект, у которого можно проверить состояние (захвачен/не захвачен). Создается он в виде HANDLE он для того, чтобы мог работать с WaitForSingleObject/WaitForMultipleObjects. В Win мьютекс может быть как локальным, так и глобальным.
разве объект критическая секция не предоставляет API для того что бы проверить состояние ? TryEnterCriticalSection. Тогда получается ты опять неверно свою мысль выразил. Или я тебя не понял, и разница между критической секицией и мютексом много более того что первая только среди нитей, а второй также и среди процессов.
Получается, что по своей сути мьютекс и критическая секция в Windows не отличаются. Правда, с помощью WaitForSingleObject можно проверить состояние мьютекса с заданным таймаутом, чего TryEnterCriticalSection не позволяет сделать. WaitForMultipleObjects позволяет отслеживать состояние сразу нескольких мьютексов.
Крит.секции в отличие от мьютексов не являются объектами ядра ОС, им не нужно тратить время на переключение контекстов потоков из режима юзера в режим ядра.
ну вот поэтому они и работают быстрей и используются только для нитей. PS. теперь меня еще интересует наличие объекта аналогичного критической секции в pthread и в boost::thread, рано и поздно я дойду до этого сам, боюсь будет поздно
В pthread мьютексы аналогичны крит.секциям win. Насколько я помню, они тоже в контексте только одного процесса работают.
это частично проясняет ситуацию для pthread PS. но сразу встает вопрос о сложности использования, мол разделяемую память над иметь, да еще и сам процесс этого сложен и мало описан. В противопоставление имеем виндовс потоки который разделил два сих понятия, правда о сложностях использования виндовских мютексов между разными потоками я вообще информации пока не имею. Но там они как объекты ядра, поэтому с одной стороны нет заморочек с разделяемой пмятью, с другой это медленно. Еще один коварный вопрос, в pthread мютексы же ведь не являются объектов ядра. По этому с одной стороны юзать их легко (процессозагруженность минимум) с другой, это вытекает в проблему использования между процессами.
Мютекс - это абстракция, созданная для синхронизации потоков. Более конкретно мютекс - это двоичный семафор. Семафор - это это особы тип разделяемой переменной, которую обрабатывает только две функции . 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. Информация взята из Грегори Р. Эндрюс - Основы многопоточного, параллельного и распределенного программирования. В свое время готовился к экз. по этой книге.
Мьютексы - для синхронизации потоков разных приложений. Критические секции - для синхронизации потоков одного приложения. Критические секции работают быстрее, чем мьютексы. Это для Windows.