从另一个线程调用 Boost 线程 Sleep_For()
Posted
技术标签:
【中文标题】从另一个线程调用 Boost 线程 Sleep_For()【英文标题】:Calling Boost Thread Sleep_For() From Another Thread 【发布时间】:2013-08-20 11:38:11 【问题描述】:像很多其他人一样,我目前也在为 boost::thread 开发一个小包装类,并面临编写一个可以从另一个线程调用的简单 sleep(int miliseconds) 函数的问题。就像以前的 boost::thread::sleep() 一样。由于该功能即将停用,因此有新选项:boost::this_thread::sleep_for() 和 sleep_until()。但我不明白我怎么能设法用这些来实现想要的行为。而且我也找不到解决方案,尽管这似乎是很多人的问题。
所以我的 ThreadWrapper 类内部有一个 boost::thread 工作。我想做的是这样的:
ThreadWrapper thread(func_foo);
Thread.sleep(100); //tells the underlying boost:thread of my Threadwrapper
//to sleep 100ms
有什么建议吗?谢谢!
【问题讨论】:
明确地说,您想将 sleep() 调用“注入”到另一个线程中吗? 是的,差不多。我的类 ThreadWrapper 包含一个 boost 线程和函数 sleep(int ms) ,它应该告诉 boost 线程对象休眠指定的时间量。但实际上,这是一个普遍的问题:假设您在 main 函数中创建了一个 boost::thread m_BoostThread。如果你不应该再使用 m_BoostThread.sleep(),你会如何让它从你的 main 函数中休眠? 你到底想解决什么问题(我觉得这是一个 XY 问题——你认为 X 是问题 Y 的答案,所以你认为 X 是怎么做的)。int main() boost::thread mThread(func_foo); mThread.sleep(boost::chrono::milliseconds(50));
如果我不应该再使用sleep(),我该如何实现?新选项 sleep_for() 和 sleep_until() 只允许线程让自己进入睡眠状态,在我的示例中,它们将在 func_foo 函数中调用。
AFAIK,永远不可能以任何安全的方式做你想做的事。需要相当多的操作系统支持才能使另一个线程脱离运行状态(即,它运行在另一个内核上,而不是请求睡眠的内核上)。以这种方式挂起线程往往会对整个进程产生不幸的影响,例如。当持有全局内存管理互斥锁的线程被挂起时。
【参考方案1】:
在我看来这是特定于应用程序的......比如目标线程中的哪个位置应该发生睡眠?假设您有一个线程在等待套接字数据...它实际上已经在休眠...您是否希望它在数据实际到达时再休眠一些?还是停止等待数据?或者,也许你有一个线程处理数字......你可能希望它在工作块之后进入睡眠状态。所以,在我看来,你可以有一个简单的类方法setToPause(int ms)
,它设置一个成员sleeper
值,然后你的工作线程/目标线程在适当的时候检查该值,如果它被设置,则重置并休眠(或休眠 然后 重置,具体取决于您的要求)。不确定这是否能解决您的特定问题(甚至是什么),但它必须比尝试使用线程调度更容易......
【讨论】:
感谢您的回答。在这个时候,我不知道我的包装类到底要做什么。在我们的项目中,我们有一个自己的库,提供应该很快就会停止使用的线程函数。我的工作是编写一个基于 boost 线程的包装器,它提供完全相同的功能。我既不能概述它的用途,也不能概述它的使用方式。 好吧,在 Windows 中你可以使用SuspendThread
和ResumeThread
。 POSIX 标准没有提供线程 A 可以挂起另一个线程 B 的执行的机制,而无需 B 的合作,因此您必须为每个目标平台使用一些其他机制...以上是关于从另一个线程调用 Boost 线程 Sleep_For()的主要内容,如果未能解决你的问题,请参考以下文章