boost 线程安全队列
- // QueueImplementation.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <iostream>
- #include <queue>
- #include <string>
- #include <process.h>
- using namespace std;
- struct DataBlock
- {
- string m_szText; //sample data
- };
- class CDataQueue
- {
- private:
- queue<DataBlock> m_oQueue; //contains the actual data
- CRITICAL_SECTION m_csData; //to synchroize access to m_csData among multiple threads
- HANDLE m_hEvent; //for signalling presence of absence of data
- public:
- //create a manual reset event initially signalled.
- //This event will be signalled and shall remain so whenever there is data in the queue and
- //it shall be reset as long as queue is empty
- CDataQueue()
- {
- InitializeCriticalSection(&m_csData);
- m_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
- };
- //close the event handle
- ~CDataQueue()
- {
- DeleteCriticalSection(&m_csData);
- CloseHandle(m_hEvent);
- };
- //public methods to Push data to queue
- void Push(DataBlock& oNewData)
- {
- EnterCriticalSection(&m_csData);
- //push new element to queue
- m_oQueue.push(oNewData);
- //now that there is atleast one element, set the event
- SetEvent(m_hEvent);
- LeaveCriticalSection(&m_csData);
- };
- //public methods to Pop data from queue
- DataBlock Pop()
- {
- EnterCriticalSection(&m_csData);
- //first get the topmost data block
- DataBlock popData = m_oQueue.front();
- //next remove it from queue
- m_oQueue.pop();
- //now, check for new size.. if no more elements in queue
- //reset the event
- if(!m_oQueue.size())
- ResetEvent(m_hEvent);
- LeaveCriticalSection(&m_csData);
- return popData;
- };
- //helper method to get the event handle
- HANDLE GetEvent(){return m_hEvent;};
- };
- CDataQueue g_oQueue;
- HANDLE g_hExitEvent;
- unsigned __stdcall ProcessData (void * )
- {
- HANDLE hEvents[] = { g_hExitEvent, g_oQueue.GetEvent()};
- DWORD dwRet;
- BOOL bContinue = TRUE;
- while(bContinue)
- {
- dwRet = WaitForMultipleObjects(sizeof(hEvents)/sizeof(hEvents[0]),hEvents,FALSE,INFINITE);
- switch(dwRet)
- {
- case WAIT_OBJECT_0 :
- {
- //exit signalled.. time to quit the thread
- bContinue = FALSE;
- }
- break;
- case WAIT_OBJECT_0 + 1:
- {
- //some data got..
- DataBlock oData = g_oQueue.Pop();
- //echo data to screen
- cout << "Data typed in is .. " << oData.m_szText << "/n";
- }
- break;
- default:break;
- }
- }
- return 0;
- }
- int main(int argc, char* argv[])
- {
- DWORD dwThreadID = 0;
- HANDLE hThread = NULL;
- //create an event to signal worker thread to exit
- g_hExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//not signalled initially..
- //spawn a thread for processing the input
- hThread = (HANDLE)_beginthreadex(NULL,0,ProcessData,NULL,0,(unsigned int *)&dwThreadID);
- if(hThread)
- {
- cout << "enter sentence to process /nOR /nenter /"exit/" to quit/n";
- do
- {
- DataBlock oData;
- cin >> oData.m_szText;
- //if exit typed in.. quit
- if(0 == oData.m_szText.compare("exit"))
- break;
- g_oQueue.Push(oData);
- }
- while(1);
- //time to close ..set the exit event
- SetEvent(g_hExitEvent);
- //wait for worker thread to close
- WaitForSingleObject(hThread,INFINITE);
- //close the thread handle
- CloseHandle(hThread);
- }
- CloseHandle(g_hExitEvent);
- return 0;
- }
- template<typename Data>
- class concurrent_queue
- {
- private:
- std::queue<Data> the_queue;
- mutable boost::mutex the_mutex;
- boost::condition_variable the_condition_variable;
- public:
- void push(Data const& data)
- {
- boost::mutex::scoped_lock lock(the_mutex);
- the_queue.push(data);
- lock.unlock();
- the_condition_variable.notify_one();
- }
- bool empty() const
- {
- boost::mutex::scoped_lock lock(the_mutex);
- return the_queue.empty();
- }
- bool try_pop(Data& popped_value)
- {
- boost::mutex::scoped_lock lock(the_mutex);
- if(the_queue.empty())
- {
- return false;
- }
- popped_value=the_queue.front();
- the_queue.pop();
- return true;
- }
- void wait_and_pop(Data& popped_value)
- {
- boost::mutex::scoped_lock lock(the_mutex);
- while(the_queue.empty())
- {
- the_condition_variable.wait(lock);
- }
- popped_value=the_queue.front();
- the_queue.pop();
- }
- };
boost 线程安全队列的更多相关文章
- 使用Condition Variables 实现一个线程安全队列
使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...
- Boost线程库学习笔记
一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...
- Boost线程详解
一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...
- Boost 线程学习笔记
Bolg转载自:http://www.cnblogs.com/lvdongjie/p/4447193.html 一: 创建线程 #include <iostream> #include & ...
- Linux多线程系列-2-条件变量的使用(线程安全队列的实现)
多线程情况下,往往需要使用互斥变量来实现线程间的同步,实现资源正确共享. linux下使用如下变量和函数 //条件变量 pthread_cond_t int pthread_cond_init (pt ...
- BOOST 线程完全攻略 - 基础篇
http://blog.csdn.net/iamnieo/article/details/2908621 2008-09-10 12:48 9202人阅读 评论(3) 收藏 举报 thread多线程l ...
- BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类
本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...
- 线程池 队列 synchronized
线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...
- Java线程安全队列BlockingQueue
线程安全队列BlockingQueue 用法跟普通队列没有区别,只是加入了多线程支持. 这里主要说说add和put,以及poll和take的区别: add和put都是用来忘队列里面塞东西的,而poll ...
随机推荐
- UVA101 【The Blocks Problem】
一个大模拟!!! 总的来说就是碰到move就要把a上面的全部放回原处. 如果碰到onto就要把b上面的全部放到原处. 因为move是只移动a一个,所以a上面的要归位,而pile是移一堆,所以不用. o ...
- F 多重背包 判断能否刚好装满
Description 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. Input 首先是一个正整数T(1<=T<=100)接下来是T组数据每组数据 ...
- POJ 2393 Yogurt factory【贪心】
POJ 2393 题意: 每周可以生产牛奶,每周生产的价格为Ci,每周需要上交的牛奶量Yi,你可以选择本周生产牛奶,也可选择提前几周生产出存储在仓库中(仓库无限大,而且保质期不考虑),每一周存仓库牛奶 ...
- MySQL和Java数据类型对应
Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.S ...
- div+css中height:auto !important; height:663px; min-height:663px !important;区别
height:auto !important是高度自适应,主要的是,!important只是对于ie6不认识而已,其他浏览器都是以这个为最高的优先级,执行这个,ie6会无视这个,不是只有火狐而已hei ...
- 【Java】 剑指offer(22) 链表中倒数第k个结点
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...
- js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?
日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...
- php手撸轻量级开发(一)
聊聊本文内容 之前讲过php简单的内容,但是原生永远是不够看的,这次用框架做一些功能性的事情. 但是公司用自己的框架不能拿出来,用了用一些流行的框架比如tp,larveral之类的感觉太重,CI也不顺 ...
- git使用经验for windows
一.本地同步fork的最新版本 二.git命令 一.本地同步fork的最新版本 ①打开Git CMD工具,进入git的主目录 ②使用 git remote -v 查看fork的远程仓库地址 origi ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...