真的不能同时挂起两个std/posix线程吗?
Is it really impossible to suspend two std/posix threads at the same time?
我想在 Linux 上同时 运行 暂时挂起多个 C++ std 线程。
OS.
似乎不支持
线程处理需要不均匀且不可预测的时间量(几秒)的任务。
当 CPU 温度超过阈值时,我想暂停它们。
仅在任务之间检查任务内的暂停是不切实际的。
我只想让所有工作人员暂停操作几毫秒。
怎么做到的?
我现在在做什么
我目前在一个纤细的自定义二进制信号量中使用条件变量 class(想想 C++20 信号量)。
工作人员在开始下一个任务之前通过获取并立即释放信号量来检查是否挂起。
如果温度太高,一个单独的控制线程会占用控制信号量几毫秒。
这通常效果很好,CPU 温度稳定。
我不太关心暂停线程的轻微延迟。
但是,当一个任务比其他任务花费的时间长几秒时,它的线程将继续单独 运行。
这将激活 CPU turbo 模式,这与我想要实现的相反(它的功率效率相对较低,因此不利于散热)。
我无法停用 CPU turbo,因为我不控制硬件。
换句话说,任务需要很长时间才能完成。
所以我想从外面强行暂停它们。
I want to suspend them when the CPU temperature rises above a threshold.
总的来说,就是本末倒置。
正确设计的硬件应该为最大负载提供足够的冷却能力,并且您的程序不应超过该冷却能力。
此外,由于您在谈论 Turbo,我们可以假设一个英特尔 CPU,它将自行进行热调节,使您的程序 运行 变慢,而无需您做任何事情。
In other words, the tasks take too long to complete
您可以将任务分解成更小的部分,并更频繁地检查信号量。
A separate control thread occupies the control semaphore for a few milliseconds
您的硬件不太可能对 毫秒 延迟做出反应——对于任何热量来说,这个时间尺度都太短了。监测温度并在温度上升并接近极限时简单地减少计划的任务数量可能会更好。
I've now implemented it with pthread_kill
and SIGRT
.
请注意,在未知状态下挂起线程(无论目标任务在收到信号时正在做什么)都是导致 死锁 的方法。任务可能在 malloc
内,可能持有任意锁等
如果你的“控制线程”也需要那个锁,它就会阻塞,你就输了。您的控制线程必须只执行直接系统调用,不得调用 libc
等
此解决方案无法测试,也无法正确实施。
我想在 Linux 上同时 运行 暂时挂起多个 C++ std 线程。 OS.
似乎不支持线程处理需要不均匀且不可预测的时间量(几秒)的任务。 当 CPU 温度超过阈值时,我想暂停它们。 仅在任务之间检查任务内的暂停是不切实际的。
我只想让所有工作人员暂停操作几毫秒。 怎么做到的?
我现在在做什么
我目前在一个纤细的自定义二进制信号量中使用条件变量 class(想想 C++20 信号量)。 工作人员在开始下一个任务之前通过获取并立即释放信号量来检查是否挂起。 如果温度太高,一个单独的控制线程会占用控制信号量几毫秒。 这通常效果很好,CPU 温度稳定。
我不太关心暂停线程的轻微延迟。 但是,当一个任务比其他任务花费的时间长几秒时,它的线程将继续单独 运行。 这将激活 CPU turbo 模式,这与我想要实现的相反(它的功率效率相对较低,因此不利于散热)。 我无法停用 CPU turbo,因为我不控制硬件。 换句话说,任务需要很长时间才能完成。 所以我想从外面强行暂停它们。
I want to suspend them when the CPU temperature rises above a threshold.
总的来说,就是本末倒置。
正确设计的硬件应该为最大负载提供足够的冷却能力,并且您的程序不应超过该冷却能力。
此外,由于您在谈论 Turbo,我们可以假设一个英特尔 CPU,它将自行进行热调节,使您的程序 运行 变慢,而无需您做任何事情。
In other words, the tasks take too long to complete
您可以将任务分解成更小的部分,并更频繁地检查信号量。
A separate control thread occupies the control semaphore for a few milliseconds
您的硬件不太可能对 毫秒 延迟做出反应——对于任何热量来说,这个时间尺度都太短了。监测温度并在温度上升并接近极限时简单地减少计划的任务数量可能会更好。
I've now implemented it with
pthread_kill
andSIGRT
.
请注意,在未知状态下挂起线程(无论目标任务在收到信号时正在做什么)都是导致 死锁 的方法。任务可能在 malloc
内,可能持有任意锁等
如果你的“控制线程”也需要那个锁,它就会阻塞,你就输了。您的控制线程必须只执行直接系统调用,不得调用 libc
等
此解决方案无法测试,也无法正确实施。