让线程在退出之前设置标志(或发出事件信号)是一种竞争条件。该线程还不一定返回到操作系统,并且可能仍在执行。
例如,考虑一个加载动态库(伪代码)的程序:
lib = loadLibrary("someLibrary");
fun = getFunction("someFunction");
fun();
unloadLibrary(lib);
让我们假设这个库使用你的线程:
void someFunction() {
volatile bool finished_flag = false;
thrd = new boost::thread(boost::bind(&myclass::mymethod, this, &finished_flag);
while(!finished_flag) { // ignore the polling loop, it's besides the point
sleep();
}
delete thrd;
}
void myclass::mymethod() {
// do stuff
finished_flag = true;
}
当myclass::mymethod()
设置finished_flag
为 时true
,myclass::mymethod()
尚未返回。至少,它仍然必须执行某种“返回”指令(如果不是更多:析构函数、异常处理程序管理等)。如果执行的线程myclass::mymethod()
在此之前被抢占,someFunction()
将返回调用程序,调用程序将卸载库。当正在执行的线程myclass::mymethod()
被安排再次运行时,包含“return”指令的地址不再有效,程序崩溃。
解决方案是在返回之前someFunction()
打电话thrd->join()
。这将确保线程已返回操作系统并且不再执行。