在 C/C++ 之中这类问题,主要出现在STL两个BCL基础类库使用上面,std::mutex、std::thread,它是指在析构时,某些行为没有被正确处理导致的。
对于 std::mutex,类为析构时,仍旧存在原子信号量标志没有释放,即:
.lock() 执行后,没有成对执行 .unlock() 函数。
对于 std::thread,类为析构时,线程状态仍处于可 joinable() 状态,导致的问题,在 C/C++ 之中,STL标准库为了确保 std::thread 的一些安全性,用户必须显示的 detach、join 处理并释放线程持有状态。
join 为加入线程,等待线程结束,并且清除 joinable 标志,但需要注意:它必须是在析构运行之前执行。
detach 为清除 joinable 标志,但需要注意:它必须是在析构运行之前执行,这是个小问题,大家在做多线程编程时,注意些其实不会产生什么太大问题。
但需要确保一点,用户必须确保线程可以正确停止退出,否则在 LINUX 平台上运行,退出时可能会产生僵尸进程的问题。