Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在互斥锁内调用sleep()的缺点是什么?_C_Multithreading_Mutex_Thread Synchronization_Coverity - Fatal编程技术网

C 在互斥锁内调用sleep()的缺点是什么?

C 在互斥锁内调用sleep()的缺点是什么?,c,multithreading,mutex,thread-synchronization,coverity,C,Multithreading,Mutex,Thread Synchronization,Coverity,例如: pthread_mutex_lock(); //Do something sleep(1); //causes issues waiting while holding lock pthread_mutex_unlock(); 如果我们不想在互斥锁内使用睡眠,那么解决方案是什么?根据经验,通常(但并非总是)不想长时间持有互斥锁(否则,锁定同一互斥锁的其他线程会等待太长时间),对于一个处理器来说,一整秒钟是一段很长的时间,它每秒执行数十亿次基本运算 您可能

例如:

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

pthread_mutex_unlock();

如果我们不想在互斥锁内使用睡眠,那么解决方案是什么?根据经验,通常(但并非总是)不想长时间持有互斥锁(否则,锁定同一互斥锁的其他线程会等待太长时间),对于一个处理器来说,一整秒钟是一段很长的时间,它每秒执行数十亿次基本运算

您可能希望使用(因为正在释放互斥),或者在锁定区域之外执行
睡眠
(或某些…)。您甚至可以在Linux上使用-s-或更便宜但特定于Linux的-在运行事件循环的线程之间进行通信

该方法具有启发性,可能会发出错误警报


花点时间读一本好书。

解决办法是不睡觉。更好的问题是“为什么会有人在互斥锁内调用sleep()。我完全不知道为什么会有人这么做。要完全回答这个问题,我们首先需要知道为什么你在持有锁的情况下调用sleep()。几十年来我编写了很多多线程应用程序,我记不起所有的设计细节,但我100%确定我从未调用过sleep()在锁内。他调用sleep最可能的原因是确保互斥锁保持相当长的时间,以便他可以查看互斥锁的工作方式/检查锁的工作情况。在测试用例中调用
sleep
并不罕见,例如,如果您想测试如果某件事情花费的时间比预期的长会发生什么。