C++多线程的简单方法

xiaoxiao2022-06-11  40

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

std::atomic_int a; std::atomic<int> 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<std::mutex> lock(m_mutex)

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

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

 

 

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-4931412.html

最新回复(0)