ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

多线程中的std::condition_variable条件变量学习

多线程中的std::condition_variable条件变量学习 std::condition_variable 是与 std::mutex 一起使用的同步原语它能用于阻塞一个线程或同时阻塞多个线程直至另一线程修改共享变量条件并通知 std::condition_variable。有意修改共享变量的线程必须1.获得 std::mutex常通过 std::lock_guard2.在保有锁时进行修改3.在std::condition_variable上执行notify_one或notify_all可以释放锁后再通知即使共享变量是原子的也必须在拥有互斥体时修改它以把修改发布到等待的线程。下面来看具体的使用示例//condition_variable.cpp condition_variable example //#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex #include condition_variable #include string std::mutex mtx; std::condition_variable cv; std::string data; bool ready false; bool processed false; void worker_thread() { //等待直至 main() 发送数据 std::unique_lock lk(mtx); printf(worker_thread1ready%d\n, ready); cv.wait(lk, [] {return ready; }); printf(worker_thread2ready%d\n, ready); std::this_thread::sleep_for(std::chrono::seconds(2)); //暂停2秒 // 等待后我们占有锁 printf(工作线程正在处理数据\n); data 处理后; // 发送数据回 main() processed true; printf(工作线程指示数据已经处理完成\n); // 通知前完成手动解锁以避免等待线程才被唤醒就阻塞细节见 notify_one lk.unlock(); cv.notify_one(); } int main() { //1.记录开始时间点 auto start std::chrono::steady_clock::now(); std::thread worker(worker_thread); data 数据样例; // 发送数据到 worker 线程 { std::lock_guard lk(mtx); //std::this_thread::sleep_for(std::chrono::seconds(2)); //暂停2秒 ready true; printf(main() 指示数据已准备好进行处理\n); } cv.notify_one(); // 等候 worker { std::unique_lock lk(mtx); printf(main1processed%d\n, processed); cv.wait(lk, [] { return processed; }); printf(main2processed%d\n, processed); } printf(返回 main()data %s\n, data.c_str()); worker.join(); //2.记录结束时间点 auto end std::chrono::steady_clock::now(); //3.计算时间差 auto elapsed end - start; printf(耗时: %lld 纳秒\n, std::chrono::duration_caststd::chrono::nanoseconds(elapsed).count()); printf(耗时: %lld 微秒\n, std::chrono::duration_caststd::chrono::microseconds(elapsed).count()); printf(耗时: %lld 毫秒\n, std::chrono::duration_caststd::chrono::milliseconds(elapsed).count()); printf(耗时: %lld 秒\n, std::chrono::duration_caststd::chrono::seconds(elapsed).count()); printf(hello learn condition_variable\n); return 0; }编译运行下面来看wait()一个参数的示例//condition_variable2.cpp condition_variable example //#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex #include condition_variable std::mutex mtx; std::condition_variable cv; bool ready false; void print_id(int id) { std::unique_lockstd::mutex lck(mtx); printf(print_id1id%d\n, id); while (!ready) cv.wait(lck); printf(print_id2id%d\n, id); std::this_thread::sleep_for(std::chrono::seconds(1)); //暂停2秒 printf(threadid%d\n, id); } void go() { std::unique_lockstd::mutex lck(mtx); printf(go1\n); //std::this_thread::sleep_for(std::chrono::seconds(12)); //暂停2秒 ready true; cv.notify_all(); //通知所有线程 } int main() { //1.记录开始时间点 auto start std::chrono::steady_clock::now(); std::thread threads[10]; // spawn 10 threads: for (int i 0; i 10; i) threads[i] std::thread(print_id, i); printf(10 threads ready to race...\n); go(); printf(main1\n); for (auto th : threads) th.join(); printf(main1\n); //2.记录结束时间点 auto end std::chrono::steady_clock::now(); //3.计算时间差 auto elapsed end - start; printf(耗时: %lld 纳秒\n, std::chrono::duration_caststd::chrono::nanoseconds(elapsed).count()); printf(耗时: %lld 微秒\n, std::chrono::duration_caststd::chrono::microseconds(elapsed).count()); printf(耗时: %lld 毫秒\n, std::chrono::duration_caststd::chrono::milliseconds(elapsed).count()); printf(耗时: %lld 秒\n, std::chrono::duration_caststd::chrono::seconds(elapsed).count()); printf(hello learn condition_variable\n); return 0; }编译运行参考https://zh.cppreference.com/cpp/thread/condition_variablehttps://cplusplus.com/reference/condition_variable/condition_variable/https://blog.csdn.net/m0_67168421/article/details/128302838https://blog.csdn.net/FL1768317420/article/details/136613939https://blog.csdn.net/u011808673/article/details/91783965https://liucjy.blog.csdn.net/article/details/130298493https://lizuohao.blog.csdn.net/article/details/136274149
返回列表