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[];
for (int i = ; i < ; ++i)
thread[i] = std::thread(do_print_id, i); std::cout << "start..." << std::endl;
//触发激活
go(); //等待线程结束执行
for (auto & th : thread)
th.join(); return ;
}
显示如下:
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;
};
最新文章
- 如何利用 Visual Studio 自定义项目或工程模板
- 贪吃蛇的java代码分析(二)
- Spring JDBC实现查询
- 值得使用的Spring Boot
- Linux下安装Nginx服务器
- C# 正则表达式及常用正则表达式
- ConcurrentHashMap使用示例
- java常用string inputStream转换
- (转载)equals与==
- Windows Phone 8初学者开发—第2部分:安装Windows Phone SDK 8.0
- Description Resource Path Location Type AndroidManifest.xml file missing!
- asp.net core系列 51 Identity 授权(下)
- QPalette
- Git里有些费解的术语和设计
- Android判断网络是否打开,并打开设置网络界面
- Freemarker出现NullNumberException异常
- Cadence丢失了csdCommon.dll
- Spring Boot&mdash;10ModelAndView、Model,以及@ModelAttribute注解
- HTML5实战与剖析之字符集属性(charset和defaultCharset)
- spark[源码]-DAG调度器源码分析[二]