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

  • 相关阅读:
    UrlRewrite(地址变换)技术在IIS 5.0/ASP平台上面的应用
    Asp.Net页面输出到EXCEL
    [收藏] ASP.NET缓存:方法和最佳实践
    基于.NET的全文索引引擎Lucene.NET
    [ASP.NET]支持up,down以及pageup,pagedown,home,end,Enter键盘操作的DataGrid
    无知所以羞耻
    你相信世界上有心有灵犀的事情吗?
    javascript的日期加减
    2007312
    人应该多向上
  • 原文地址:https://www.cnblogs.com/itdef/p/4561970.html
Copyright © 2011-2022 走看看