精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
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,就容易进入这个陷阱。
这文章是我在外文网站上看到的,不知道国内书籍讲解怎样,希望对大家有用,欢迎关注和收藏锐英源软件。