C++11的线程库(二)
2015-08-14 11:19
453 查看
本次主要是讨论关于互斥量的使用。首先看一个建的例子:
上面的代码在10行的位置声明看一个互斥量valMutex,并通过该互斥量实现读写的互斥,但是上面的做法有很多的隐患,我们如果程序在加锁以后抛出了异常,那么这个锁有可能永远无法被获取,标准中提供了一种利用代码域的概念使用局部变量的形式进行加锁和解锁操作。
但是并不推荐这么使用,这么使用不符合RAII的规范,建议使用基于RAII规范,你会发现C++11为你提供了这一个规范,我们不妨使用lock_guard这个模板,如下:
上面的程序利用了RAII的机制,避免了因为异常跳出函数而不能或者忘记释放锁带来的问题。
(还在整理。。。未完待续。。。)
#include <iostream> #include <thread> #include <atomic> #include <mutex> using namespace std; int val=20; std::mutex valMutex; //control exclusive access to val int func(int argc){ //thread 1 add valMutex.lock(); val += 2; cout << "func : " << val << endl; valMutex.unlock(); return 0; } int foo(int argc){ //thread 2 valMutex.lock(); val *= 2; cout << "foo : " << val << endl; valMutex.unlock(); return 0; } int main() { val = 10; valMutex.lock(); //保证thread 是在线程1、2前输出 thread t1(func, 0); thread t2(foo, 0); cout << "thread:" << endl; valMutex.unlock(); t1.join(); t2.join(); system("pause"); return 0; }
上面的代码在10行的位置声明看一个互斥量valMutex,并通过该互斥量实现读写的互斥,但是上面的做法有很多的隐患,我们如果程序在加锁以后抛出了异常,那么这个锁有可能永远无法被获取,标准中提供了一种利用代码域的概念使用局部变量的形式进行加锁和解锁操作。
但是并不推荐这么使用,这么使用不符合RAII的规范,建议使用基于RAII规范,你会发现C++11为你提供了这一个规范,我们不妨使用lock_guard这个模板,如下:
// Concurr001.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <vector> #include <chrono> #include <thread> #include <future> #include <atomic> #include <mutex> #include <condition_variable> using namespace std; std::mutex sMutex; int solve() { { std::lock_guard<mutex> lg(sMutex); /* 需要互斥的代码 */ }//释放锁 }
上面的程序利用了RAII的机制,避免了因为异常跳出函数而不能或者忘记释放锁带来的问题。
(还在整理。。。未完待续。。。)
相关文章推荐
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
- java调用C/C++写的库函数 dll
- hdu1087
- c++ primer 【笔记】multimap 和 multiset类型
- C++Primer 第五版 练习10.12解答
- C/C++中extern关键字详解
- 虚函数——C++PrimeCr第五版读书笔记
- 【二】C++基于C的一些改变
- c语言实现魔方阵算法
- C++中左值与右值引用———C++Primer读书笔记
- Java与C++的区别
- C++ Primer 学习笔记与思考_4 ---getline&&size_type&&const_iterator混搭
- c++中的 extern "C"
- VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像
- c++ cout 格式化输出浮点数、整数及格方法
- c语言语法(三)
- iOS概念入门学习-C语言-字符串
- C++序列操作之std::partition
- C语言的有符号与无符号,二进制整数的扩展与截断
- VC++ 浅谈VS2010中CMFCToolBar的用法