美文网首页
生产者消费者中条件变量的使用

生产者消费者中条件变量的使用

作者: 九楼记 | 来源:发表于2022-06-05 18:27 被阅读0次

使用的层次说明

多线程同步
互斥锁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

相关文章

网友评论

      本文标题:生产者消费者中条件变量的使用

      本文链接:https://www.haomeiwen.com/subject/cdgrmrtx.html