目录
- 1. mutex
- 2. lock_guard
- 3. unique_lock 是 lock_guard 的升级加强版
- 4. condition_variable
- 5. 调用
#include “thread”
#include “mutex”
#include “iostream”
//! std::thread
//! jion 阻塞式, .join()后面的代码等待线程结束
//! detach 非阻塞式, 后面代码继续执行
1. mutex
类型 | 说明 |
---|---|
std::mutex | 最基本的 Mutex 类。 |
std::recursive_mutex | 递归 Mutex 类 |
std::time_mutex | 定时 Mutex 类 |
std::recursive_timed_mutex | 定时递归 Mutex 类。 |
std::mutex mtx;
int i = 0;
void add1()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add1 i = "<<++i<<std::endl;mtx.unlock();
}void add2()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add2 i = "<<++i<<std::endl;mtx.unlock();
}
2. lock_guard
//! 创建即加锁,作用域结束自动析构并解锁,无需手工解锁
//! 不能中途解锁,必须等作用域结束才解锁
//! 不能复制
void add3()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add3 i = "<<++i<<std::endl;}
}void add4()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add4 i = "<<++i<<std::endl;}
}
3. unique_lock 是 lock_guard 的升级加强版
//! 创建时可以不锁定(通过指定第二个参数为std::defer_lock),而在需要时再锁定
//! 可以随时加锁解锁
//! 作用域规则同 lock_grard,析构时自动释放锁
//! 不可复制,可移动
//! 条件变量需要该类型的锁作为参数(此时必须使用unique_lock)
//! std::adopt_lock (必须先加锁)
//! std::try_to_lock
//! std::defer_lock (必须手动加锁)
void add5()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);// 先加锁//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);// 后手动加锁//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx); //自动加锁for(int n = 0; n < 20; ++n)std::cout<<"add5 i = "<<++i<<std::endl;
}void add6()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);for(int n = 0; n < 20; ++n)std::cout<<"add6 i = "<<++i<<std::endl;
}
4. condition_variable
std::condition_variable cv;
bool wait = false;
void printf1(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(wait) cv.wait(ulock);std::cout<<"printf1 " << i <<std::endl;wait = true;cv.notify_one();}
}void printf2(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(!wait) cv.wait(ulock);std::cout<<"printf2 " << i+10 <<std::endl;wait = false;cv.notify_one();}
}
5. 调用
//! 1.mutexstd::thread td(add1);std::thread td2(add2);td.join();td2.join();
//! 2. lock_guardstd::thread td3(add3);std::thread td4(add4);td3.detach();td4.detach();
//! 3. unique_lock
std::thread td5(add5);
std::thread td6(add6);
td5.detach();
td6.detach();
//! 4. condition_variable + unique_lock
std::thread td7(printf1, 10);
std::thread td8(printf2, 10);
td7.detach();
td8.detach();