从另一个线程取消nanosleep()

时间:2019-12-11 13:28:50

标签: c multithreading pthreads

我正在尝试编写多线程工作者和求职者程序代码 Job Giver线程将作业推送到具有随机延迟数据的数组,它可以在1秒后或10000 ...之后再处理,这一切都取决于Job Giver。 辅助线程nanosleep()直到获得最短的延迟作业,然后对其进行处理并将其从作业数组中删除。 一切正常,除非工作提供者将较短的延迟作业推入数组,而工作线程仍nanosleep()到旧的最短作业,因此延迟得比预期的要长。

现在,作为快速解决方案,我使用signal()来处理信号SIGUSR1来处理信号。 当求职者将新的最短时间推到最短时,它将SIGUSR1发送到整个程序并取消工人的nanosleep()。 但是我认为这不是最好的方法,因为它会发送到整个程序,而我只想取消一个线程的nanosleep()

总而言之,如何在不触摸信号的情况下从主线程取消其他线程的nanosleep()

注意;我在具有C语言的linux上使用pthread。

注意;延迟以纳秒为单位。使用当前设置,我可以达到50µs的损耗。

3 个答案:

答案 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_lockpthread_mutex_unlock

y用于nanosleeppthread_cond_waitpthread_cond_timedwaitpthread_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