zoukankan      html  css  js  c++  java
  • c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event。

    阻塞等待出发,不过condition_variable可以批量出发。

    代码如下:

    // 1111111.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    std::mutex gmtx; 
    std::condition_variable gcv; 
    bool gready = false;
    
    void do_print_id(int id)
    {
        std::unique_lock<std::mutex> lock(gmtx);
        while (!gready)
            gcv.wait(lock);
        std::cout << "thread " << id << std::endl;
    }
    
    void go()
    {
        std::unique_lock<std::mutex> lock(gmtx);
        gready = true;
        gcv.notify_all();
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::thread thread[50];
        for (int i = 0; i < 50; ++i)
            thread[i] = std::thread(do_print_id, i);
    
        std::cout << "start..." << std::endl;
        //触发激活
        go();
    
        //等待线程结束执行
        for (auto & th : thread)
            th.join();
    
        return 0;
    }

    显示如下:

    start...
    thread 7
    thread 3
    thread 2
    thread 9
    thread 6
    thread 5
    thread 1
    thread 0
    thread 4
    thread 8
    请按任意键继续. . .

    #pragma once
    // 参考http://www.cnblogs.com/qicosmos/archive/2013/05/30/3107975.html
    #include <thread>
    #include <condition_variable>
    #include <mutex>
    #include <list>
    #include <iostream>

    using namespace std;

    template<typename T>
    class SimpleSyncQueue {
    public:
    void PutWithLock(const T& x)
    {
    std::lock_guard<std::mutex> locker(m_mutex);
    m_queue.emplace_back(x);
    m_notEmpty.notify_one();
    }
    template<typename U>
    void PutWithLock(const T&& x)
    {
    std::lock_guard<std::mutex> locker(m_mutex);
    m_queue.emplace_back(std::forward<U>(x));
    m_notEmpty.notify_one();
    }
    void PopWithLock(T& x)
    {
    std::unique_lock<std::mutex> locker(m_mutex);
    while (m_queue.empty())
    m_notEmpty.wait(locker);
    x = m_queue.front();
    m_queue.pop_front();
    }
    private:
    std::list<T> m_queue;
    std::mutex m_mutex;
    std::condition_variable m_notEmpty;
    };

  • 相关阅读:
    C/C++程序内存的分配
    【解题报告】UVA101 The Blocks Problem
    洗牌算法
    【持续更新】算法竞赛常用模板
    北京邮电大学2021乐理公共选修课期末考试
    Oracle通用大数据量存储过程分页修正版
    (转)NHibernate 3.0在PetShop 3层架构中的应用
    Json.Net学习笔记
    JS获得浏览器高度和宽度参数
    jQuery数组处理汇总
  • 原文地址:https://www.cnblogs.com/itdef/p/4561970.html
Copyright © 2011-2022 走看看