В чем недостаток вызова sleep() внутри блокировки мьютекса?

Например:

pthread_mutex_lock();
//Do something
sleep(1);                //causes issues waiting while holding lock

pthread_mutex_unlock();

какое решение, если мы не хотим использовать сон внутри блокировки мьютекса

1 ответ

Как правило, вы обычно (но не всегда) не хотите удерживать мьютекс в течение длительного периода времени (в противном случае другие потоки, блокирующие тот же мьютекс, будут ждать слишком долго), а полная секунда - это длинный период для процессора, выполняющего миллиарды элементарных операций каждую секунду.

Вы можете использовать условные переменные (так как pthread_cond_wait атомарно освобождает мьютекс), или сделать sleep (или какой-то опрос (2)...) за пределами заблокированного региона. Вы можете даже - на Linux- использовать pipe (7)-s - или более дешевый, но специфичный для Linux eventfd (2)- для связи между потоками, запускающими циклы событий.

Анализатор статического источника покрытия является эвристическим и может выдавать ложные тревоги.

Найдите время, чтобы прочитать хороший учебник Pthread.

Другие вопросы по тегам