1. 多线程访问共享资源没有加锁
错误提示:Segmentation fault!
解决办法:
- 多线程读不需要加锁
- 多线程同时读写则需要加锁
加锁的方法有互斥量、信号量、读写锁、记录锁、互斥量和条件变量结合提供的事件通知机制。
C++11里则有,lock_guard,unique_lock.两者都是在构造的时候加锁,析构的时候加锁。但unique_lock提供更多的特性,比如可以指定它在构造的时候不加锁,在需要的时候再调用.lock()加锁。如果和condition_variable结合使用只能用unqiue_lock.
2. 指针变量在定义的时候没有初始化为nullptr,或者在某个时候执行变成了悬挂指针,导致不可预知的错误。
错误提示:Segmentaion fault!
解决方法:
- 指针变量在声明的时候初始化为nullptr,在使用的时候判断if(!ptr)
- 仔细检查代码,杜绝出现悬挂指针。
3. std::thread在joinalble状态下析构会导致terminate
错误提示::terminate called without an active exception. Aborted
解决办法:
- 创建thread的时候调用detach使之变为分离线程
- thread执行之后调用join等待thread正常结束
但是在写代码量多了之后,有时候会在甘个代码分支过早退出而引起thread析构而没运行到join语句,这样就会导致terminate;
示例代码如下:
void foo()
{
//do something;
}
int main()
{
std::thread t(foo);
if(true)return1;
t.join();
return0;
}
代码8时t以foo构造并运行,此是为joinable状态,代码9时程序退出,导致t在t.join()之前析构,thread在joinable状态析构下会导致terminate。~thread函数在cplusplus说明如下:
If the thread is joinable when destroyed, terminate() is called.