互斥类型 | 解释 |
---|---|
mutex(C++11) | 提供基本互斥设施(类) |
timed_mutex(C++11) | 提供互斥设施,实现有时限锁定(类) |
recursive_mutex(C++11) | 提供能被同一线程递归锁定的互斥设施(类) |
recursive_timed_mutex(C++11) | 提供能被同一线程递归锁定的互斥设施,并实现有时限锁定(类) |
shared_mutex(C++17) | 提供共享互斥设施(类) |
shared_timed_mutex(C++14) | 提供共享互斥设施并实现有时限锁定(类) |
互斥管理 | 解释 |
---|---|
lock_guard(C++11) | 实现严格基于作用域的互斥体所有权包装器(类模板) |
scoped_lock (C++17) | 用于多个互斥体的免死锁 RAII 封装器(类模板) |
unique_lock (C++11) | 实现可移动的互斥体所有权包装器(类模板) |
shared_lock(C++14) | 实现可移动的共享互斥体所有权封装器(类模板) |
defer_lock_t(C++11) try_to_lock_t(C++11) adopt_lock_t(C++11) | 用于指定锁定策略的标签类型(类) |
defer_lock(C++11) try_to_lock(C++11) adopt_lock(C++11) | 用于指定锁定策略的标签常量(常量) |
#include#include
2、std::recursive_mutex
#include#include#includeclass X {std::recursive_mutex m;
std::string shared;
public:
void fun1() {std::lock_guardlk(m);
shared = "fun1";
std::cout<< "in fun1, shared variable is now "<< shared<< '\n';
}
void fun2() {std::lock_guardlk(m);
shared = "fun2";
std::cout<< "in fun2, shared variable is now "<< shared<< '\n';
fun1(); // 递归锁在此处变得有用
std::cout<< "back in fun2, shared variable is "<< shared<< '\n';
};
};
int main()
{X x;
std::thread t1(&X::fun1, &x);
std::thread t2(&X::fun2, &x);
t1.join();
t2.join();
}
3、std::shared_mutex、std::shared_lock、std::unique_lock
C++17 std::shared_mutex的替代方案boost::shared_mutex
shared_mutex 类,结合 unique_lock 与 shared_lock 的使用,可以实现读写锁。
通常读写锁需要完成以下功能:
对应于功能1,2我们可以这样来描述:
#include#include#includeusing namespace std;
typedef std::shared_lockread_lock;
typedef std::unique_lockwrite_lock;
std::shared_mutex read_write_mutex;
int32_t g_data =0;
//线程A,读data
void fun1()
{for (size_t i = 0; i< 10; i++)
{read_lock rlock(read_write_mutex);
cout<< "t1:g_data="<< g_data<< endl;
}
}
//线程B,读data
void fun2()
{for (size_t i = 0; i< 10; i++)
{read_lock rlock(read_write_mutex);
std::cout<<"t2:g_data="<< g_data<< endl;
}
}
//线程C,写data
void fun3()
{for (size_t i = 0; i< 10; i++)
{write_lock rlock(read_write_mutex);
g_data++;
std::cout<< "t3:g_data="<< g_data<< endl;
}
}
int main()
{thread t3(fun3);
thread t1(fun1);
thread t2(fun2);
t1.join();
t2.join();
t3.join();
}
输出如下
结果说明:
简单总结下
lock_guard:更加灵活的锁管理类模板,构造时是否加锁是可选的,在对象析构时如果持有锁会自动释放锁,所有权可以转移。对象生命期内允许手动加锁和释放锁。
scope_lock:严格基于作用域(scope-based)的锁管理类模板,构造时是否加锁是可选的(不加锁时假定当前线程已经获得锁的所有权),析构时自动释放锁,所有权不可转移,对象生存期内不允许手动加锁和释放锁。
share_lock:用于管理可转移和共享所有权的互斥对象。
参考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、书籍《c++服务器开发精髓》——张远龙
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧