gpt4 book ai didi

c - 在没有条件变量的情况下实现 pthread 之间的阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:08 25 4
gpt4 key购买 nike

我正在 Linux 上使用 pthreads 实现老板/员工设计模式。我想要一个不断检查工作的老板线程,如果有工作,则唤醒一个正在 sleep 的 worker 来完成工作。我的问题是:我应该使用哪种类型的 IPC 同步/机制来实现从我的老板线程移交给我的工作人员到我的工作人员醒来之间的最少延迟?

简单的解决方案是使用 Pthread 条件变量并在老板线程中调用 pthread_cond_signal,在每个工作线程中调用 pthread_cond_wait,但我想知道有什么更快的东西可以用来实现阻塞和发信号吗?例如,在 boss 和 worker 线程之间使用管道会怎样?

如何衡量一种 IPC 与另一种 IPC 的性能?例如,我看到了 pipe() 和 fork() 的基准测试,但没有看到将 pipe() 用作线程间通信的基准测试。

如果我可以澄清我的问题,请告诉我!

编辑作为我将如何使用 pipe() 在我的工作线程和老板线程之间实现阻塞的示例,工作线程将 read() 一个管道,并且由于它是空的然后将阻塞该读取调用,直到老板调用 write( ) 上。

最佳答案

pthreads 的 glibc 实现使用低级“futex”锁来实现 pthread_cond_wait()/pthread_cond_signal()。 Futexes 被设计为一种快速同步原语,因此它们可能优于管道或类似方法(至少,使用管道需要向内核空间复制一个字节或从内核空间复制一个字节,而 futexes 不需要)。

如果 pthread_cond_wait()/pthread_cond_signal() 很好地映射到您的问题(听起来它们确实如此),那么超越它们的唯一方法可能是自己在 futexes 上实现一些东西(例如,如果你不使用它,你可以消除线程取消的处理)。

可能值得对您的应用程序进行基准测试 - 除非您的工作单元确实非常小,否则条件变量唤醒延迟不太可能占主导地位。

关于c - 在没有条件变量的情况下实现 pthread 之间的阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com