1. mutex是用来保证线程同步的,防止不同的线程同时操作同一个共享数据
1.1 C++11四种互斥量
std::mutex,最常用,普遍的互斥量(默认属性),独占式互斥量
std::recursive_mutex ,允许同一线程使用recursive_mutext多次加锁,然后使用相同次数的解锁操作解锁(mutex多次加锁会造成死锁)
std::timed_mutex,允许超时的独占式互斥量,在mutex上增加了时间的属性。增加了两个成员函数try_lock_for(),try_lock_until(),分别接收一个时间范围,再给定的时间内如果互斥量被锁主了,线程阻塞,超过时间,返回false。
std::recursive_timed_mutex,允许超时的递归式互斥量,增加递归和时间属性
1.2 函数
lock(),互斥量加锁,如果互斥量已被加锁,线程阻塞bool try_lock(),尝试加锁,如果互斥量未被加锁,则执行加锁操作,返回true;如果互斥量已被加锁,返回false,线程不阻塞。void unlock(),解锁互斥量
2. 例子
int cnt = 20;
std::mutex m;
void t1()
{
while (cnt > 0)
{
m.lock();
if (cnt > 0)
{
//sleep(1);
--cnt;
std::cout << "t1 " << cnt << std::endl;
}
m.unlock();
}
}
void t2()
{
while (cnt > 0)
{
m.lock();
if (cnt > 0)
{
--cnt;
std::cout << "t2 " << cnt << std::endl;
}
m.unlock();
}
}
int test(void)
{
std::thread th1(t1);
std::thread th2(t2);
th1.join(); //等待t1退出
th2.join(); //等待t2退出
std::cout << "test" << std::endl;
return 0;
}
输出结果会有多种,但cnt是依次递减的
t1 19 t1 18 t1 17 t1 16 t1 15 t1 14 t1 13 t1 12 t1 11 t1 10 t1 9 t1 8 t1 7 t2 6 t2 5 t2 4 t2 3 t2 2 t2 1 t2 0 mutex test 或 t1 19 t1 18 t1 17 t1 16 t1 15 t1 14 t1 13 t1 12 t1 11 t1 10 t1 9 t1 8 t1 7 t1 6 t1 5 t1 4 t1 3 t1 2 t1 1 t1 0 mutex test



