c++多线程
c++多线程
NFTBc++多线程
一、线程创建
1.1 创建线程
线程头文件 thread
1 | std::thread thread([]{ |
1.2 互斥量、原子变量
互斥量头文件 mutex
1 | std::mutex mtx; |
使用std::lock_guard
实现自动上锁解锁(RAII),生命周期是作用域
1 | std::lock_guard<std::mutex> lock(mtx); |
使用std::unique_lock
可以手动关锁1
2
3
4std::unique_lock<std::mutex> lock(mtx);
++sum;
--sum;
lock.unlock();
原子变量头文件 atmoic
1 | std::atomic<int> sum=0; |
1.3 条件变量、信号量
条件变量头文件 condition_variable
当cv.wait(lock);
执行时会先释放锁,等被notify通知后会再次获取锁
1 |
|
信号量头文件 semaphore
1 | std::counting_semaphore<6>csem(0);//最大值为6 |
1.4 promise future
头文件 future
1 | void task(int a,int b,std::promise<int>& ret){ |
1.5 std::packaged_task std::async
async使用1
2
3
4
5
6
7
8
9
10
11
12int task(int a,int b){
a*=a;
b*=2;
return a+b;
}
int main(){
std::future<int> f=std::async(std::launch::async,task,1,2);
//直接开启一个线程计算
// std::future<int> f=std::async(std::launch::deferred,task,1,2);
//等到get时再计算(默认为deferred)
std::cout<<f.get()<<'\n';
}
paskaged_task使用1
2
3
4
5
6
7
8
9
10
11
12int task(int a,int b){
a*=a;
b*=2;
return a+b;
}
int main(){
std::packaged_task<int(int,int)> t(task);
// std::packaged_task<int(int,int)> t(std::bind(task,1,2));
//将参数绑定,后续直接t()调用
t(1,2);
std::cout<<t.get_future().get()<<'\n';
}