【问题标题】:What is disadvantage of calling sleep() inside mutex lock?在互斥锁内调用 sleep() 有什么缺点?
【发布时间】:2018-08-20 10:54:40
【问题描述】:

例如:

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

pthread_mutex_unlock();

如果我们不想在互斥锁中使用睡眠,解决办法是什么

【问题讨论】:

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

标签: c multithreading mutex thread-synchronization coverity


【解决方案1】:

根据经验,您通常(但并非总是)不想长时间持有互斥锁(否则,锁定同一个互斥锁的其他线程会等待太久),整整一秒是处理器每秒执行数十亿次基本操作的时间很长。

您可能想使用condition variables(因为pthread_cond_waitatomically 释放互斥锁),或者在锁定区域之外执行sleep(或一些poll(2)...)。您甚至可以 - 在 Linux 上 - 使用 pipe(7)-s - 或者更便宜但特定于 Linux 的 eventfd(2)- 在运行事件循环的线程之间进行通信。

coverity static source analyzer 是启发式的,可能会发出错误警报。

花点时间阅读一篇好的Pthread tutorial

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2019-11-09
    • 2012-03-12
    • 2011-04-13
    • 2014-02-28
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多