精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
C++11提供了一些新类,代替了些系统API类常用功能,功能增强了,但是使用复杂度增加了,这里就介绍一个容易引起问题的地方:C++11mutex死锁示例,看下面代码:
template <typename T>
class container
{
std::mutex _lock;
std::vector<T> _elements;
public:
void add(T element)
{
_lock.lock();
_elements.push_back(element);
_lock.unlock();
}
void addrange(int num, ...)
{
va_list arguments;
va_start(arguments, num);
for (int i = 0; i < num; i++)
{
_lock.lock();
add(va_arg(arguments, T));
_lock.unlock();
}
va_end(arguments);
}
void dump()
{
_lock.lock();
for(auto e : _elements)
std::cout << e << std::endl;
_lock.unlock();
}
};
void func(container<int>& cont)
{
cont.addrange(3, rand(), rand(), rand());
}
int main()
{
srand((unsigned int)time(0));
container<int> cont;
std::thread t1(func, std::ref(cont));
std::thread t2(func, std::ref(cont));
std::thread t3(func, std::ref(cont));
t1.join();
t2.join();
t3.join();
cont.dump();
return 0;
}
std::mutex在线程里不能多次访问,第一次访问,可以,后面访问就死锁了。在线程函数func调用addrange时,里面是循环,循环肯定多次调用了mutex,这时候就会死锁。为了解决此问题,可以用recursive_mutex。
另外MFC里有CMutex类,此类对象Lock和Unlock使用时,没这个特色,如果看类名类似,盲目使用c++11的mutex,就容易进入这个陷阱。
这文章是我在外文网站上看到的,不知道国内书籍讲解怎样,希望对大家有用,欢迎关注和收藏锐英源软件。