考虑以下示例代码,该代码创建一个线程并使用thread::interrupt
调用将其从主线程中断:
#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <boost/ref.hpp>
int main()
{
boost::thread t([]{
int counter = 0;
while (1){
std::cout << "interruption enabled " << boost::this_thread::interruption_enabled() << std::endl;
try {
counter++;
if (counter % 5 == 0)
throw std::runtime_error("runtime error!");
std::cout << "thread functionn";
boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
}
catch (boost::thread_interrupted &interruption)
{
std::cout << "oops!.. time to finish!" << std::endl;
return;
//std::cout << "...but couldn't o_O..." << std::endl;
}
catch (std::exception &e)
{
std::cout << "some exception: " << e.what() << std::endl;
}
}
});
boost::this_thread::sleep_for(boost::chrono::milliseconds(3000));
t.interrupt();
std::cout << "joinable: " << t.joinable() << std::endl;
if (t.joinable())
if (!t.try_join_for(boost::chrono::milliseconds(500)))
{
std::cout <<"still RUNNINGn detach it..." << std::endl;
t.detach();
}
std::cout << "main threadn";
boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
return 0;
}
现在,当在OS X 10.10.3上像这样编译时(默认情况下使用libc ++):
g++ main.cpp -I<path_to_boost_1_54_0> -std=gnu++11 -lboost_thread-mt -lboost_system-mt -lboost_chrono-mt -L<path_to_boost_1_54_0>/stage/lib
输出显示中断已启用:
interruption enabled 1
thread function
interruption enabled 1
thread function
...
但是,如果将使用libstdc++:
g++ main.cpp -I<path_to_boost_1_54_0> -std=gnu++11 -stdlib=libstdc++ -lboost_thread-mt -lboost_system-mt -lboost_chrono-mt -L<path_to_boost_1_54_0>/stage/lib
我得到的输出告诉我中断被禁用:
interruption enabled 0
thread function
interruption enabled 0
thread function
...
这种行为有原因吗?我使用了boost v1.54.0和这个LLVM v6.1.0:
$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
谢谢
我已经在 Linux 上重现了这个:
- 使用 GCC 4.8、4.9 它可以工作
-
使用 clang 3.5 和 libstdc++ 它可以工作
interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 some exception: runtime error! interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 thread function interruption enabled 1 some exception: runtime error! interruption enabled 1 thread function interruption enabled 1 thread function joinable: 1 oops!.. time to finish! main thread
-
对于 Clang 3.5 和 libc++,它不起作用:
interruption enabled 128 thread function oops!.. time to finish! joinable: 1 Segmentation fault (core dumped)
在我看来,这个问题应该在提升列表中报告。
提升开发人员有可能指出这是libc ++中的一个错误