【问题标题】:pthread_mutex_lock takes much time [closed]pthread_mutex_lock 需要很多时间[关闭]
【发布时间】:2014-08-16 02:33:58
【问题描述】:

在我用 C 语言编写的应用程序中,我有两个线程:

第一个线程包含一个用于进程间通信的 UDP 侦听器,用于发送信号。当信号到达该线程时,它会尝试使用pthread_mutex_lock 锁定第二个线程以执行某些功能,然后将其解锁,第二个线程继续正常执行。

我注意到锁定线程消耗了太多时间,例如大约 100 毫秒,这太多了。但有时它消耗的时间不多,大约 10 毫秒,这对我来说还可以。

那么谁能告诉我发生了什么,为什么我的可执行代码会出现如此多的时间变化?有没有更好的方法来以更好的方式实现我正在做的事情,即锁定和解锁?

注意:我正在使用 Linux Ubuntu x64 位、2GB 内存和 2 个 CPU 的虚拟机中运行我的应用程序,最终输出处于发布模式。

【问题讨论】:

  • 你能给我们看一些代码(锁定另一个线程),你如何测量程序中的时间?
  • 可能其他线程很忙,持有锁100ms。
  • @nos 我想到了,因为第二个线程总是很忙并且进入无限循环,所以我把 ulsep(5) 放在循环中,这足以让 UDP 侦听器线程锁定第二个线程。
  • 我也认为您应该发布一些代码。那么,您是否有一个线程产生某些东西,而另一个线程使用它并使用 UDP 进行通信?
  • @HA-AS 如果问题是 2. 线程 持有 锁 100 毫秒,这可能无济于事。但是,您的问题也可能是您的 2. 线程对互斥锁进行了很多快速锁定/解锁,这可能会导致饥饿,在这种情况下,您可能需要类似 stackoverflow.com/questions/12685112/… 的东西,但是当我们不这样做时,几乎不可能给出建议了解您的代码的外观以及线程在 拥有锁时实际在做什么。

标签: c linux multithreading tcp udp


【解决方案1】:

重申问题:您有一个负责处理某些数据的工作线程,以及一个控制工作人员活动的监控线程。您想知道为什么在通过互斥锁停止工作线程时会有延迟。

只有当线程试图锁定它时,互斥锁才可能阻塞线程。如果该线程在到达尝试锁定互斥锁的那一点之前正在经历一些计算,您将遇到延迟。该延迟将根据监视线程锁定互斥锁时线程执行的位置而有所不同。

减少延迟的唯一方法是减少互斥锁尝试之间的工作负载,但这也会降低吞吐量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2020-03-19
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2021-12-02
    相关资源
    最近更新 更多