
C++11提供几种形式的mutex,并对应的提供了如下接口:
mutex,是最基本的互斥类:
| 当前状态 | lock | try_lock | unlock |
| 未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
| 已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 未定义行为 |
| 已被当前线程加锁 | 死锁 | 死锁 | 调用线程释放锁 |
recursive_mutex,同一线程内可递归(重入)的互斥类:
| 当前状态 | lock | try_lock | unlock |
| 未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
| 已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 未定义行为 |
| 已被当前线程加锁 | 继续加锁 | 继续加锁 | 解锁次数与加锁次数相同后,调用线程释放锁 |
timed_mutex,带时限请求锁定能力的互斥类:
| 当前状态 | lock | try_lock | try_lock_for | try_lock_until | unlock |
| 未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
| 已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 未定义行为 |
| 已被当前线程加锁 | 死锁 | 死锁 | 死锁 | 死锁 | 调用线程释放锁 |
recursive_timed_mutex,同一线程内可递归(重入)的timed_mutex:
| 当前状态 | lock | try_lock | try_lock_for | try_lock_until | unlock |
| 未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
| 已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 未定义行为 |
| 已被当前线程加锁 | 继续加锁 | 继续加锁 | 继续加锁 | 继续加锁 | 解锁次数与加锁次数相同后,调用线程释放锁 |
#include
#include
#include
using namespace std;
int g_d{0};
void tFunc(mutex& m)
{
for(int i = 0; i < 1000000; ++i)
{
m.lock(); //通过mutex加锁避免竞争
g_d++;
m.unlock();
}
}
int main(){
mutex m;
thread t1(tFunc, ref(m));
thread t2(tFunc, ref(m));
t1.join();
t2.join();
cout<
需要说明的是:
mutex相关类不支持拷贝构造、赋值,也不支持移动构造以及移动赋值。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)