1. // QueueImplementation.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <iostream>
  6. #include <queue>
  7. #include <string>
  8. #include <process.h>
  9. using namespace std;
  10. struct DataBlock
  11. {
  12. string m_szText;    //sample data
  13. };
  14. class CDataQueue
  15. {
  16. private:
  17. queue<DataBlock>  m_oQueue;   //contains the actual data
  18. CRITICAL_SECTION        m_csData;   //to synchroize access to m_csData among multiple threads
  19. HANDLE                  m_hEvent;   //for signalling presence of absence of data
  20. public:
  21. //create a manual reset event initially signalled.
  22. //This event will be signalled and shall remain so whenever there is data in the queue and
  23. //it shall be reset as long as queue is empty
  24. CDataQueue()
  25. {
  26. InitializeCriticalSection(&m_csData);
  27. m_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  28. };
  29. //close the event handle
  30. ~CDataQueue()
  31. {
  32. DeleteCriticalSection(&m_csData);
  33. CloseHandle(m_hEvent);
  34. };
  35. //public methods to Push data to queue
  36. void Push(DataBlock& oNewData)
  37. {
  38. EnterCriticalSection(&m_csData);
  39. //push new element to queue
  40. m_oQueue.push(oNewData);
  41. //now that there is atleast one element, set the event
  42. SetEvent(m_hEvent);
  43. LeaveCriticalSection(&m_csData);
  44. };
  45. //public methods to Pop data from queue
  46. DataBlock Pop()
  47. {
  48. EnterCriticalSection(&m_csData);
  49. //first get the topmost data block
  50. DataBlock popData = m_oQueue.front();
  51. //next remove it from queue
  52. m_oQueue.pop();
  53. //now, check for new size.. if no more elements in queue
  54. //reset the event
  55. if(!m_oQueue.size())
  56. ResetEvent(m_hEvent);
  57. LeaveCriticalSection(&m_csData);
  58. return popData;
  59. };
  60. //helper method to get the event handle
  61. HANDLE GetEvent(){return m_hEvent;};
  62. };
  63. CDataQueue g_oQueue;
  64. HANDLE     g_hExitEvent;
  65. unsigned __stdcall ProcessData (void * )
  66. {
  67. HANDLE hEvents[] = { g_hExitEvent, g_oQueue.GetEvent()};
  68. DWORD dwRet;
  69. BOOL bContinue = TRUE;
  70. while(bContinue)
  71. {
  72. dwRet = WaitForMultipleObjects(sizeof(hEvents)/sizeof(hEvents[0]),hEvents,FALSE,INFINITE);
  73. switch(dwRet)
  74. {
  75. case WAIT_OBJECT_0 :
  76. {
  77. //exit signalled.. time to quit the thread
  78. bContinue = FALSE;
  79. }
  80. break;
  81. case WAIT_OBJECT_0 + 1:
  82. {
  83. //some data got..
  84. DataBlock oData = g_oQueue.Pop();
  85. //echo data to screen
  86. cout << "Data typed in is .. " << oData.m_szText << "/n";
  87. }
  88. break;
  89. default:break;
  90. }
  91. }
  92. return 0;
  93. }
  94. int main(int argc, char* argv[])
  95. {
  96. DWORD dwThreadID = 0;
  97. HANDLE hThread = NULL;
  98. //create an event to signal worker thread to exit
  99. g_hExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//not signalled initially..
  100. //spawn a thread for processing the input
  101. hThread = (HANDLE)_beginthreadex(NULL,0,ProcessData,NULL,0,(unsigned int *)&dwThreadID);
  102. if(hThread)
  103. {
  104. cout << "enter sentence to process /nOR /nenter /"exit/" to quit/n";
  105. do
  106. {
  107. DataBlock oData;
  108. cin >> oData.m_szText;
  109. //if exit typed in.. quit
  110. if(0 == oData.m_szText.compare("exit"))
  111. break;
  112. g_oQueue.Push(oData);
  113. }
  114. while(1);
  115. //time to close ..set the exit event
  116. SetEvent(g_hExitEvent);
  117. //wait for worker thread to close
  118. WaitForSingleObject(hThread,INFINITE);
  119. //close the thread handle
  120. CloseHandle(hThread);
  121. }
  122. CloseHandle(g_hExitEvent);
  123. return 0;
  124. }
  1. template<typename Data>
  2. class concurrent_queue
  3. {
  4. private:
  5. std::queue<Data> the_queue;
  6. mutable boost::mutex the_mutex;
  7. boost::condition_variable the_condition_variable;
  8. public:
  9. void push(Data const& data)
  10. {
  11. boost::mutex::scoped_lock lock(the_mutex);
  12. the_queue.push(data);
  13. lock.unlock();
  14. the_condition_variable.notify_one();
  15. }
  16. bool empty() const
  17. {
  18. boost::mutex::scoped_lock lock(the_mutex);
  19. return the_queue.empty();
  20. }
  21. bool try_pop(Data& popped_value)
  22. {
  23. boost::mutex::scoped_lock lock(the_mutex);
  24. if(the_queue.empty())
  25. {
  26. return false;
  27. }
  28. popped_value=the_queue.front();
  29. the_queue.pop();
  30. return true;
  31. }
  32. void wait_and_pop(Data& popped_value)
  33. {
  34. boost::mutex::scoped_lock lock(the_mutex);
  35. while(the_queue.empty())
  36. {
  37. the_condition_variable.wait(lock);
  38. }
  39. popped_value=the_queue.front();
  40. the_queue.pop();
  41. }
  42. };

boost 线程安全队列的更多相关文章

  1. 使用Condition Variables 实现一个线程安全队列

    使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...

  2. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  3. Boost线程详解

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  4. Boost 线程学习笔记

    Bolg转载自:http://www.cnblogs.com/lvdongjie/p/4447193.html 一: 创建线程 #include <iostream> #include & ...

  5. Linux多线程系列-2-条件变量的使用(线程安全队列的实现)

    多线程情况下,往往需要使用互斥变量来实现线程间的同步,实现资源正确共享. linux下使用如下变量和函数 //条件变量 pthread_cond_t int pthread_cond_init (pt ...

  6. BOOST 线程完全攻略 - 基础篇

    http://blog.csdn.net/iamnieo/article/details/2908621 2008-09-10 12:48 9202人阅读 评论(3) 收藏 举报 thread多线程l ...

  7. BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类

    本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...

  8. 线程池 队列 synchronized

    线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...

  9. Java线程安全队列BlockingQueue

    线程安全队列BlockingQueue 用法跟普通队列没有区别,只是加入了多线程支持. 这里主要说说add和put,以及poll和take的区别: add和put都是用来忘队列里面塞东西的,而poll ...

随机推荐

  1. OCM_第十九天课程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 应用/DATA GUARD 搭建

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  2. python通过Cookie跳过登录验证码

    1.通过浏览器获取登录cookie,找到重要的两个参数“BAIDUID”和“BDUSS”: 2.编写Selenium自动化测试脚本,跳过登录. from selenium import webdriv ...

  3. LeetCode(56):合并区间

    Medium! 题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18] ...

  4. composer 安装依赖缓慢,查看 composer 的详细执行日志

    在 windows WSL 上安装 composer 依赖 composer install 发现执行异常缓慢,怀疑没有走国内的镜像,而是直接访问的 github. 需要能看到 composer 的执 ...

  5. django----重定向

    urlpatterns = [ re_path(r'^(\w+)(\w+)/$',views.index,name="index"), ] 1.<a href="{ ...

  6. python 全栈开发,Day52(关于DOM操作的相关案例,JS中的面向对象,定时器,BOM,client、offset、scroll系列)

    昨日作业讲解: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉, ...

  7. react-router4 + webpack Code Splitting

    项目升级为react-router4后,就尝试着根据官方文档进行代码分割.https://reacttraining.com/react-router/web/guides/code-splittin ...

  8. css盒子模型和定位

    content padding border margin 可以理解为在商场上看到的电视机. 电视机------content 装电视机的箱子边框有粗细------border 电视机与箱子之间的泡沫 ...

  9. 新建asp.net core项目

    开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建web项目时,务必选择“ASP.NET ...

  10. Java jvm 内存参数限制

    nohup java -jar -Xms3g -Xmx3g jenkins.war > jenkins.log 2>&1 &