您的位置:首页 > 编程语言 > C语言/C++

C++11的线程库(二)

2015-08-14 11:19 453 查看
本次主要是讨论关于互斥量的使用。首先看一个建的例子:

#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的机制,避免了因为异常跳出函数而不能或者忘记释放锁带来的问题。

(还在整理。。。未完待续。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: