使用的层次说明
多线程同步
互斥锁mutex,lock_guard和unique_lock<mutex>用法
原子操作
条件变量
原子变量demo
#include<iostream>
#include<atomic>
#include<thread>
#include<vector>
using namespace std;
//int num = 0;
atomic_int num(0);
// 线程函数,内部对num自增100次
void Add()
{
for(int i=0;i<10000;i++)
{
num++;
}
}
int main()
{
clock_t startClock = clock(); // 记下开始时间
// 3个线程,创建即运行
thread t1(Add);
thread t2(Add);
thread t3(Add);
// 等待3个线程结束
t1.join();
t2.join();
t3.join();
clock_t endClock = clock(); // 记下结束时间
cout<<"耗时:"<<endClock-startClock<<",单位:"<<CLOCKS_PER_SEC<<",result:"<<num<<endl;
return 0;
}
生产者消费者demo
#include<iostream>
#include<mutex>
#include<thread>
#include<deque>
#include<condition_variable>
using namespace std;
deque<int> q;
mutex mtx;
condition_variable cond;
void produce() {
int count = 10;
while (count > 0) {
unique_lock<mutex> lck(mtx);
q.push_front(count);
cout << "Produce value: " << count << endl;
lck.unlock();
cond.notify_one();
this_thread::sleep_for(chrono::seconds(1));
-- count;
}
}
void consume() {
int data = 0;
while (data != 1) {
unique_lock<mutex> lck(mtx);
while (q.empty()) {
cond.wait(lck);
}
data = q.front();
q.pop_front();
cout << "Consume value: " << data << endl;
lck.unlock();
}
}
int main() {
thread t1(produce);
thread t2(consume);
t1.join();
t2.join();
return 0;
}
条件变量使用说明
条件变量用于阻塞一个或多个线程,直到某个线程修改线程间的共享变量,并通过condition_variable通知其余阻塞线程。从而使得已阻塞的线程可以继续处理后续的操作。
条件变量的作用:
- 用于通知已阻塞线程,共享变量已改变
- 用于阻塞某一线程,直至该线程被唤醒
Reference
[1] https://www.cnblogs.com/fenghualong/p/13855360.html
[2] https://en.cppreference.com/w/cpp/thread/condition_variable
网友评论