• 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;
    };

  • 相关阅读:
    用 for/in 在 Java 5.0 中增强循环
    http://blog.sina.com.cn/s/articlelist_1973273451_0_1.html
    android PreferenceActivity
    高通芯片中的MDP模块[msm7x27]
    Android学习使用单例模式实现一键退出APP
    Android 开发之使用Eclipse Debug调试详解
    修改dll,效率提升50%—单键完成“复制”、“粘贴”
    MyEclipse 断言(assert)设置
    java enum 笔记 日期时间格式化
    common.logging相关网址
  • 原文地址:https://www.cnblogs.com/itdef/p/4561970.html
Copyright © 2020-2023  润新知