首页 > 其他分享 >std::thread 三:条件变量(condition_variable())

std::thread 三:条件变量(condition_variable())

时间:2023-06-18 23:23:25浏览次数:46  
标签:std thread lock list num notify variable wait

 

condition_variable  、  wait   、  notify_one   、  notify_all

 

*:notify_one:通知(唤醒)一个线程 *:notify_all:通知(唤醒)多个线程

 

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;


class A
{
public:
    void inNum()
    {
        for (int i = 0; i < 10000; i++)
        {
            std::cout << "写入一个数据:" << i << std::endl;

            std::unique_lock<std::mutex> m_lock(m_mutex);
            m_num_list.push_back(i);
            m_cond.notify_one();        // 唤醒wait()
        }
    }

    void outNum()
    {
        while (true)
        {
            std::unique_lock<std::mutex> m_lock(m_mutex);

            // wait() 用来等待一个东西
            // 如果第二个参数lambda表达式,返回false,那么wait将解锁互斥量,并阻塞到本行,等到其他线程调用notify_one()成员为止
            // 如果wait()没有第二个参数,那么效果就跟第二个参数返回false的效果一样
            m_cond.wait(m_lock, [this] {
                if (!m_num_list.empty()) { return true; }
                return false;
                });

            int num = m_num_list.front();
            m_num_list.pop_front();
            m_mutex.unlock();        // 提前解锁,让其他线程可以获取到锁,提高效率
            std::cout << "读取到数据了:" << num << std::endl;

            if (num == 9999) { break; }
        }
    }

private:
    std::mutex m_mutex;
    std::list<int> m_num_list;
    std::condition_variable m_cond;        // 生成一个条件变量对象
};

int main()
{
    A a;
    std::thread t1(&A::inNum, &a);
    std::thread t2(&A::outNum, &a);

    t1.join();
    t2.join();

    return 0;
}

 

标签:std,thread,lock,list,num,notify,variable,wait
From: https://www.cnblogs.com/shiyixirui/p/17489984.html

相关文章

  • std::thread 四:异步(async)
     *:如果std::async中传递参数std::lunnch::deferred,就需要等待调用get()或者wait()才会执行,并且代码非子线程运行,而是在主线程中执行 #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThre......
  • std::thread 五:打包任务(packaged_task)
     #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThread(intnum){cout<<"myThread()startthreadid="<<this_thread::get_i......
  • DisableThreadLibraryCalls与DLLMain死锁
    DisableThreadLibraryCalls与DLLMain死锁 1、首先写个简单的DLL,用来验证1234567891011121314151617181920212223242526272829303132BOOL APIENTRYDllMain( HMODULE hModule,                       ......
  • std::thread 一:创建线程的三种方式
    前言:#include<thread>thread.join()//阻塞thread.detach()//非阻塞thread.joinable()//bool,判断线程是否支持join或者detach 正文:创建线程有三种方式,分别是:使用函数来创建线程、使用自定义的类来创建线程、使用lambda函数来创建线程 一、使用函数来......
  • std::thread 二:互斥量(lock() & unlock())
     mutex 互斥量的作用是保护共享数据*:有lock() 就一定要有 unlock()#include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • std::thread 二:互斥量(lock_guard())
    *:使用lock_guard后,就不可以使用lock()和unlock()*:lock_guard和智能指针一样,会自动解锁 #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;......
  • std::thread 二:互斥量(多个互斥量的解决方法)
     //*:这里的lock是函数模板,最少传两个互斥量//第一种,使用lock和unlockstd::mutexm_mutex1;std::mutexm_mutex2;std::lock(m_mutex1,m_mutex2);m_mutex1.unlock();m_mutex2.unlock();//第二种,使用lock和lock_guardstd::mutexm_mutex1;std::mutexm_m......
  • std::thread 二:互斥量(带超时的互斥量 timed_mutex())
     timed_mutex、 try_lock_for、 try_lock_until #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • std::string 拼接字符串
      #include<iostream>#include<string>#include<sstream>usingnamespacestd;intmain(){stringa="123";stringstreamb;b<<123<<"456"<<789<<"-=-=";......
  • C++面试八股文:std::string是如何实现的?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")+std::string("world")的......