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;
};
c++11多线程学习笔记之三 condition_variable使用的更多相关文章
- c++11多线程学习笔记之四 生产消费者
#ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thr ...
- c++11多线程学习笔记之一 thread基础使用
没啥好讲的 c++11 thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...
- Java多线程学习笔记之三内存屏障与Java内存模型
基本内存屏障 处理器支持那种内存重排序,就会提供能够禁止相应内存重排序的的指令,这些指令就被成为基本内存屏障:StroeLoad屏障.StroeLoad屏障.LoadLoad屏障.LoadStore屏 ...
- c++11多线程学习笔记之二 mutex使用
// 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
随机推荐
- tornado-通过判断后台数据限制登陆--简单的
import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.options # 提供 ...
- 数据库,mysql
数据库(`database`): ### 关系型数据库及非关系型数据库1. 什么是关系型数据库? 关系型数据库是一种建立在关系模型上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据.现实世 ...
- python入门-存储数据
这里的存储数据使用json格式 json 是javascript object notation的意思 javascript的对象标记 1 写入 json.dump import json nu ...
- 机器学习入门-随机森林温度预测-增加样本数据 1.sns.pairplot(画出两个关系的散点图) 2.MAE(平均绝对误差) 3.MAPE(准确率指标)
在上一个博客中,我们构建了随机森林温度预测的基础模型,并且研究了特征重要性. 在这个博客中,我们将从两方面来研究数据对预测结果的影响 第一方面:特征不变,只增加样本的数据 第二方面:增加特征数,增加样 ...
- 机器学习入门-混淆矩阵-准确度-召回率-F1score 1.itertools.product 2. confusion_matrix(test_y, pred_y)
1. itertools.product 进行数据的多种组合 intertools.product(range(0, 1), range(0, 1)) 组合的情况[0, 0], [0, 1], [ ...
- 定时器 setInterval(‘function()’, 2000)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 前端开发-4-HTML-table&form&表单控制 标签
1.table标签 <!DOCTYPE html> <html lang="cn"> <head> <meta charset=" ...
- ztree参考
ztree一 ztree二 ztree三
- 使用ngxtop实时监控nginx
Ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop.有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail ...
- python集合的交,差,并,补集合运算汇总
集合操作实际用的不多,了解即可. 交集: ( & 或者 intersection ) 并集: ( | 或者 union ) 差集: ( - 或者 differe ...