gpt4 book ai didi

c++ - boost::threads - 如何正常关机?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:12 25 4
gpt4 key购买 nike

我正在尝试通过使用 boost:threads 而不是我们自己的 Win32 线程包装器来提高 C++ 应用程序的可移植性,而优雅的线程终止问题(再次)又浮出水面。

在纯 win32 上,我使用 QueueUserAPC 来“中断”线程抛出一个“thread_interrupt”异常,导致所有 RAII 对象在退出时被清理,as described here .任何“可警报”操作系统功能都可以通过这种方式中断,因此互斥等待、 sleep 、串行和套接字 I/O 等都是可能的中断点。

但是,boost:mutexes 等在 win32 上不会被 QueueUserAPC“警告”——它们调用诸如 Sleep(n) 而不是 SleepEx(n, true)) 之类的东西

Boost 线程确实有一个“中断”机制(同样涉及抛出异常)但它似乎有一个缺点,即只有 boost::thread 调用是可中断的,所以第三方套接字库(例如)不能打断了。

要做什么?我可以在本地修改 boost 源以使其可中断,但这感觉是一个糟糕的选择,而且我认为这对可移植性没有帮助。重新设计整个应用程序以消除正常线程关闭的要求是一种同样没有吸引力的方法...

最佳答案

我有一个 Win32 的部分解决方案的想法,但我还没有测试它:

我的“线程中断”方法既可以调用 boost::thread.interrupt(),也可以调用 QueueUserAPCQueueUserAPC 调用的函数只会调用 boost::interruption_point() 以允许升压中断取得控制权。

这应该意味着线程在等待 boost 同步对象或“可警告的” native Windows 对象时被中断(但“不同”)。

关于c++ - boost::threads - 如何正常关机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3057410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com