1.scope_lock
std::scoped_lock
是C++11标准引入的一个RAII(Resource Acquisition Is Initialization)风格的锁,用于管理多个互斥锁的加锁和解锁操作。std::scoped_lock
可以一次性锁定一个或多个互斥锁,同时保证在作用域结束时自动解锁,避免了手动管理锁的加锁和解锁操作,从而避免了忘记解锁或异常情况下的锁泄漏,很好的解决了智能锁死锁的问题,在两个函数中,如果有两个锁,获取锁的顺序相反,同样会造成死锁。
#include <iostream>
#include <string>
#include <vector>
#include <mutex>
#include <thread>
using item_t = int;
class user {
public:
user(const std::string &id) : id_(id) {
}
void exchange_infos(user &other) {
std::scoped_lock sl(lock_, other.lock_);
infos_.swap(other.infos_);
std::cout << "user id:" << id_ << " exchange user id:" << other.id_ << std::endl;
}
private:
std::string id_;
std::vector<item_t>infos_;
std::mutex lock_;
};
void exchange(user &user1, user &user2) {
user1.exchange_infos(user2);
}
int main() {
user user1("user1");
user user2("user2");
user user3("user3");
user user4("user4");
std::vector<std::thread>threads;
threads.emplace_back(exchange, std::ref(user1), std::ref(user2));
threads.emplace_back(exchange, std::ref(user2), std::ref(user3));
threads.emplace_back(exchange, std::ref(user4), std::ref(user2));
threads.emplace_back(exchange, std::ref(user3), std::ref(user2));
threads.emplace_back(exchange, std::ref(user1), std::ref(user4));
for (auto &th : threads) {
if (th.joinable()) {
th.join();
}
}
return 0;
}