C++ 并发编程,std::unique_lock与std::lock_guard区别示例
背景
平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少。在看并发编程,这里总结一下。方便后续使用。
std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。
std::lock_guard
std::lock_guard是RAII模板类
的简单实现,功能简单。
1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。
2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;在实际编程中,我们也可以根据自己的场景编写resource_guard
RAII类,避免忘掉释放资源。
下面是一个使用std::lock_guard的代码例子,1+2+ .. + 100的多线程实现,每个num只能由一个线程处理。
#include <thread> #include <mutex> #include <vector> #include <iostream> #include <algorithm> std::mutex my_lock; void add(int &num, int &sum){ while(true){ std::lock_guard<std::mutex> lock(my_lock); if (num < 100){ //运行条件 num += 1; sum += num; } else { //退出条件 break; } } } int main(){ int sum = 0; int num = 0; std::vector<std::thread> ver; //保存线程的vector for(int i = 0; i < 20; ++i){ std::thread t = std::thread(add, std::ref(num), std::ref(sum)); ver.emplace_back(std::move(t)); //保存线程 } std::for_each(ver.begin(), ver.end(), std::mem_fn(&std::thread::join)); //join std::cout << sum << std::endl; }
root@ubuntu:~/c++# g++ -std=c++11 -pthread guard.cpp -o guard root@ubuntu:~/c++# ./guard 5050 root@ubuntu:~/c++#