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

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

作者: 九楼记 | 来源:发表于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