В чем недостаток вызова 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.