看起来像Linux不执行pthread_suspend并继续,但我真的需要时间。
我试过cond_wait,但是太慢了。 线程的工作主要在50us执行,但偶尔会执行500ms以上。 cond_wait的问题是双重的。 互斥锁正在采取与微秒执行相当的时间,我不需要locking。 其次,我有很多工作线程,当他们需要被唤醒时,我并不想要创buildN个条件variables。
我确切地知道哪个线程正在等待哪个工作,并且可能只是pthread_continue该线程。 一个线程知道什么时候没有更多的工作,并可以轻松地pthread_suspend本身。 这将不使用locking,避免踩踏,并更快。 问题是….没有pthread_suspend或_continue。
有任何想法吗?
让线程等待一个特定的信号。
使用pthread_sigmask和sigwait 。
让管道上的线程阻塞读取。 然后通过管道发送数据。 线程将会由于需要处理的数据的到来而唤醒。 如果数据非常大,只需通过管道发送一个指针即可。
如果特定数据需要转到特定线程,则每个线程需要一个管道。 如果任何线程可以处理任何数据,那么所有的线程都可以阻塞在同一个管道上,它们会循环唤醒。
在我看来,这样的解决方案(即使用“pthread_suspend”和“pthread_continue”)是不可避免的。
在工作线程完成工作和决定自行挂起之间可能经过任意的时间,以及实际发生的挂起。 如果主线程在此期间决定该工作线程应该再次工作,则“继续”将不起作用,工作线程将自行暂停。
(请注意,这不适用于允许“继续”排队的挂起方法,如其他答案中提到的sigwait()和read()方法)。
可能会尝试pthread_cancel的选项,但要小心是否有任何锁被释放,请阅读手册页以确定取消状态
你为什么关心哪个线程工作? 这听起来像你把自己设计成了一个角落,现在你需要一个把戏来摆脱它。 如果让任何已经运行的线程执行工作,则不需要这个技巧,而且还需要更少的上下文切换。