В [прошлой заметке][1] мы обсудили самую известную пару из лагеря инструментов синхронизации тредов — mutex и cond. Сегодня встретимся с sema — примитивом, который умеет заменять предыдущие два в одиночку. Но сначала — пара слов о случайных пробуждениях. (Спасибо [xaizek][2], который мне об этом напомнил.) В принципе, строго реализованные механизмы синхронизации этим не страдают, но, тем не менее, опытный программист на это никогда не полагается. Напомню фрагмент кода:
while(total_free_mem <= 0)
{
wait_cond(&got_free_mem, &allocator_mutex);
}
Здесь цикл вокруг wait\_cond гарантирует нам, что даже если мы вернёмся из ожидания события случайно или по ошибке, ничего страшного не случится — проверка в while обеспечит нам уверенность, что нужное состояние проверяемого объекта достигнуто. Если нет — поспим ещё в ожидании. Отметим ещё раз, что проверяем мы состояние объекта (total\_free\_mem <= 0) при запертом мьютексе, то есть никто не может его менять в то же самое время. [Читать дальше →][3]
[1]:
https://habrahabr.ru/post/278413/
[2]:
https://habrahabr.ru/users/xaizek/
[3]:
https://habrahabr.ru/post/278661/#habracut