我在这里有一个用g ++编译的theFile.cc -lboost_thread测试用例。 在运行程序时,它似乎挂在join命令中。我不确定为什么。这就像interrupt_point()函数没有从主线程获取连接请求。
#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <fstream>
#include <boost/thread.hpp>
using namespace std;
//////////////////////////////////
class SerialnIMU {
public:
~SerialnIMU();
void start();
void stop();
private:
boost::thread readThread;
class SerialReader {
public:
void operator()();
private:
};
};
////////////////////////////////
SerialnIMU::~SerialnIMU() {
stop();
}
void SerialnIMU::start() {
readThread = boost::thread(SerialReader());
cout<<"Created: "<<readThread.get_id()<<endl;
}
void SerialnIMU::stop() {
cout<<"Join: "<<readThread.get_id()<<endl;
cout<<"Joining serial thread..."<<endl;
readThread.join();
cout<<"Done."<<endl;
}
//////////////////////serial thread//////////////////
void SerialnIMU::SerialReader::operator()() {
cout<<"Serial reading thread started..."<<endl;
try {
while(true) {
boost::this_thread::interruption_point();
}
} catch(...) {
cout<<"exception was thrown."<<endl;
}
cout<<"Serial reading thread stopped."<<endl;
}
int main(int argc, char **argv) {
SerialnIMU imu;
imu.start();
imu.stop();
return 0;
}
感谢阅读。
编辑:另外,如果你删除while循环程序退出干净...升级版本1.39.0
答案 0 :(得分:2)
看来你的停止功能实际上并没有中断线程。调用join并不意味着中断,相反,如果你希望中断而不是等待正常终止,你必须在加入之前通过调用.interrupt()显式地执行它。
答案 1 :(得分:1)
线程可以捕获中断异常并无限期地继续处理。对于中断是最终的,异常必须没有被捕获,或者你可以捕获并停止处理,或者你可以使用更具破坏性的东西,如TerminateThread或pthread_cancel,它们可能并不总是进行所有的清理。
请注意,线程可以通过boost :: this_thread :: disable_interruption禁用中断。