C++多线程的简单方法

1,使用std::atomic定义,可以变量在进行简单的运算中保持原子性!

std::atomic_int a;
std::atomic a;

2,使用临界区mutex,可以对一段代码加锁

std::mutex m_mutex;
m_mutex.lock()
{
    code body;
}
m_mutex.unlock()

问题:如果出现异常,可能没有进行解锁;加锁解锁复杂。

3,自定义锁

class Lock {
public:
	Lock(std::mutex &_mutex) :mutex(_mutex) {
		mutex.lock();
	}
	~Lock() {
		mutex.unlock();
	}
private:
	std::mutex& mutex;
};
/*使用*/
void addcount(){
    Lock lock(mutex)//是一个mutex量,这里mutex和cout都同属于一个对象,这样方便
    cout++;
}

在结束祈构时自动解锁

同3问题:需要对同一个mutex加锁;在对同一个对象操作时,可以在该对象中添加一个mutex对象。对于多个对象,则出现问题。

4,C++自带,在函数开头使用

std::lock_guard lock(m_mutex)

5,多对象操作,如果自己编写的话,主要是保持加锁的顺序一致,比如利用地址进行加锁排序。

void addcount(a,b){
    std::lock(a.Mutex,b.Mutex),把Mutex完全锁住多个,同时?
	std::lock_guard lockA(a.Mutex,atd::adopt_lock);
    //第二个参数告诉已经被锁住了,只在结束时调用unlock
	std::lock_guard lockB(b.Mutex,atd::adopt_lock);
    {
        对a、b对象操作
    }
}

 

 

 

 

 

 

 

你可能感兴趣的:(C++多线程的简单方法)