从另一个线程取消 nanosleep()
Canceling nanosleep() from another thread
我正在尝试编写多线程工作者和工作提供者程序
作业提供者线程将作业推送到具有随机延迟数据的数组中,它可以在 1 秒后或 10000 秒后处理......一切都取决于作业提供者。
工作线程 nanosleep()
s 直到获得最短延迟作业,然后处理它并将其从作业数组中删除。
一切正常,除非作业提供者将较短的延迟作业推送到数组并且工作线程仍然 nanosleep()
s 到旧的最短作业,因此它的延迟超过预期。
现在作为快速修复,我用 signal()
制作了信号处理程序来处理 SIGUSR1
信号。
当工作提供者推送新的最短时,它向整个程序发送 SIGUSR1
并取消工人的 nanosleep()
。
但我不认为这是最好的方法,因为它发送到整个程序,我只想取消一个线程的 nanosleep()
.
总而言之,我如何在不触及信号的情况下从主线程取消其他线程的 nanosleep()
?
注意;我在 linux 上用 C 语言使用 pthread。
注意;延迟以纳秒为单位。使用当前设置,我可以达到 50µs 损失。
您可以使用 pthread_kill()
将 SIGUSR1
传送到单个线程
来自联机帮助页:
The pthread_kill() function sends the signal sig to thread, a thread in the same process as the caller. The signal is asynchronously directed to thread.
If sig is 0, then no signal is sent, but error checking is still performed.
这应该只对您定位的单个线程有影响。
你的 XY 问题很大。休眠和信号不是实现线程间协调的方式。我什至会说在多线程程序中休眠几乎总是表明存在某种错误。
您要执行的操作的工具是条件变量。如果您不熟悉它们,我强烈推荐 the Condition Variables part of this tutorial。您的工作人员不应该睡觉,而应该对条件变量进行定时等待,在循环中调用,并在他们等待的条件为真时退出循环。
假设我们有两个互斥体,一个叫做 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
.
来源:
计算器。com/questions/59286893/canceling-nanosleep-from-another-thread#comment104779089_59286893
我正在尝试编写多线程工作者和工作提供者程序
作业提供者线程将作业推送到具有随机延迟数据的数组中,它可以在 1 秒后或 10000 秒后处理......一切都取决于作业提供者。
工作线程 nanosleep()
s 直到获得最短延迟作业,然后处理它并将其从作业数组中删除。
一切正常,除非作业提供者将较短的延迟作业推送到数组并且工作线程仍然 nanosleep()
s 到旧的最短作业,因此它的延迟超过预期。
现在作为快速修复,我用 signal()
制作了信号处理程序来处理 SIGUSR1
信号。
当工作提供者推送新的最短时,它向整个程序发送 SIGUSR1
并取消工人的 nanosleep()
。
但我不认为这是最好的方法,因为它发送到整个程序,我只想取消一个线程的 nanosleep()
.
总而言之,我如何在不触及信号的情况下从主线程取消其他线程的 nanosleep()
?
注意;我在 linux 上用 C 语言使用 pthread。
注意;延迟以纳秒为单位。使用当前设置,我可以达到 50µs 损失。
您可以使用 pthread_kill()
将 SIGUSR1
传送到单个线程
来自联机帮助页:
The pthread_kill() function sends the signal sig to thread, a thread in the same process as the caller. The signal is asynchronously directed to thread.
If sig is 0, then no signal is sent, but error checking is still performed.
这应该只对您定位的单个线程有影响。
你的 XY 问题很大。休眠和信号不是实现线程间协调的方式。我什至会说在多线程程序中休眠几乎总是表明存在某种错误。
您要执行的操作的工具是条件变量。如果您不熟悉它们,我强烈推荐 the Condition Variables part of this tutorial。您的工作人员不应该睡觉,而应该对条件变量进行定时等待,在循环中调用,并在他们等待的条件为真时退出循环。
假设我们有两个互斥体,一个叫做 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
.
来源: 计算器。com/questions/59286893/canceling-nanosleep-from-another-thread#comment104779089_59286893