我正在尝试编写多线程工作者和求职者程序代码
Job Giver线程将作业推送到具有随机延迟数据的数组,它可以在1秒后或10000 ...之后再处理,这一切都取决于Job Giver。
辅助线程nanosleep()
直到获得最短的延迟作业,然后对其进行处理并将其从作业数组中删除。
一切正常,除非工作提供者将较短的延迟作业推入数组,而工作线程仍nanosleep()
到旧的最短作业,因此延迟得比预期的要长。
现在,作为快速解决方案,我使用signal()
来处理信号SIGUSR1
来处理信号。
当求职者将新的最短时间推到最短时,它将SIGUSR1
发送到整个程序并取消工人的nanosleep()
。
但是我认为这不是最好的方法,因为它会发送到整个程序,而我只想取消一个线程的nanosleep()
。
总而言之,如何在不触摸信号的情况下从主线程取消其他线程的nanosleep()
?
注意;我在具有C语言的linux上使用pthread。
注意;延迟以纳秒为单位。使用当前设置,我可以达到50µs的损耗。
答案 0 :(得分:1)
您可以使用pthread_kill()
将SIGUSR1
传递到单个线程
从联机帮助页:
pthread_kill()函数将信号sig发送到线程,该线程与调用程序的进程相同。该信号异步地定向到线程。
如果sig为0,则不发送信号,但仍执行错误检查。
这只会对您所针对的单线程产生影响。
答案 1 :(得分:0)
您在这里遇到很大的XY问题。睡眠和信号不是实现线程之间协调的方法。我要说的是,进入多线程程序几乎总是表明某种错误。
您要尝试执行的工具是条件变量。如果您不熟悉它们,我强烈推荐the Condition Variables part中的this tutorial。您的员工应该睡觉,而不是睡觉,应该对条件变量进行定时等待,在循环中调用,并在他们等待的条件为真时退出循环。
答案 2 :(得分:0)
假设我们有两个互斥锁,一个称为x
,另一个是y
x
用于一般锁定,例如不要尝试同时使用多个线程进行访问。 pthread_mutex_lock
和pthread_mutex_unlock
y
用于nanosleep
。 pthread_cond_wait
,pthread_cond_timedwait
和pthread_cond_signal
对于暂停,我使用cond_wait
y
,然后使用cond_signal
y
恢复。如果我需要暂停nanosleep
之类的时间,可以使用cond_timedwait
y
,然后以cond_signal
y
的相同方式恢复。
来源: stackoverflow.com/questions/59286893/canceling-nanosleep-from-another-thread#comment104779089_59286893