tbb 线程安全concurrent_queue的性能
tbb实现了线程安全的queue,这样程序员既可以不用和那些lock,mutex,criticalsection打交道,又大大提高性能,太给力了。。比较的结果见代码中的注释。结果可以看出代码足足少一半,性能足足生一倍,诱人!
#include <Windows.h>
#include <deque>
#include <iostream>
#include <process.h>
#include <tbb\concurrent_queue.h> using namespace std; static CRITICAL_SECTION s_cs;
static HANDLE s_mutex = CreateMutex(NULL, FALSE, NULL);
static deque<int> s_queue; const static int LOOP_COUNT_ = 3000000; static bool s_running = true; static tbb::concurrent_queue<int> s_tbb_queue;
/*
1. not tbb, not criticalsection, is mutex, 11656
2. not tbb, is criticalsection, not mutex, 8172
3. is tbb, not criticalsection, not mutex, 3828
*/ /*下面的两个宏是开关*/
#define _MUTEX_TEST_ ""
#define _USE_TBB_ ""
#ifdef _USE_TBB_
void thread1_(void* dummy){
LONGLONG start = GetTickCount();
for (int i = 0; i < LOOP_COUNT_; i ++){
s_tbb_queue.push(i);
}
cout << GetTickCount() - start << endl;
Sleep(20000);
s_running = false;
} void thread2_(void* dummy){
int i = 0;
int k;
while (s_running){
if (s_tbb_queue.try_pop(k))
{
i ++;
} else{
Sleep(1);
} } cout << "consume " << i << endl; }
#else #ifdef _MUTEX_TEST_
void thread1_(void* dummy){
LONGLONG start = GetTickCount();
for (int i = 0; i < LOOP_COUNT_; i ++){
WaitForSingleObject(s_mutex, INFINITE);
s_queue.push_back(i);
ReleaseMutex(s_mutex);
}
cout << GetTickCount() - start << endl;
Sleep(20000);
s_running = false;
} void thread2_(void* dummy){
int i = 0;
while (s_running){
WaitForSingleObject(s_mutex, INFINITE);
bool bEmpty = s_queue.empty();
if (!bEmpty){
int res = s_queue.front();
s_queue.pop_front();
}
ReleaseMutex(s_mutex); if (!bEmpty){
i ++;
} else {
Sleep(1);
} } cout << "consume " << i << endl; } #else
void thread1_(void* dummy){
LONGLONG start = GetTickCount();
for (int i = 0; i < LOOP_COUNT_; i ++){
EnterCriticalSection(&s_cs);
s_queue.push_back(i);
LeaveCriticalSection(&s_cs);
}
cout << GetTickCount() - start << endl;
Sleep(20000);
s_running = false;
} void thread2_(void* dummy){
int i = 0;
while (s_running){
EnterCriticalSection(&s_cs);
bool bEmpty = s_queue.empty();
if (!bEmpty){
int res = s_queue.front();
s_queue.pop_front();
}
LeaveCriticalSection(&s_cs); if (!bEmpty){
i ++;
} else {
Sleep(1);
} }
cout << "consume " << i << endl;
} #endif
#endif void main(){
InitializeCriticalSection(&s_cs);
_beginthread(thread2_, 0, NULL);
_beginthread(thread2_, 0, NULL);//2 consumer
_beginthread(thread1_, 0, NULL); while(s_running){
Sleep(10);
}
}
tbb 线程安全concurrent_queue的性能的更多相关文章
- 【转】线程及同步的性能 - 线程池 / ThreadPoolExecutors / ForkJoinPool
线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自 ...
- 通过 Javacore 诊断线程挂起等性能问题
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy_jav ...
- 线程及同步的性能 – 线程池/ ThreadPoolExecutors/ ForkJoinPool
线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自 ...
- [Java Performance] 线程及同步的性能之线程池/ThreadPoolExecutors/ForkJoinPool
线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理 ...
- Java 线程与同步的性能优化
本文探讨的主题是,如何挖掘出Java线程和同步设施的最大性能. 1.线程池与ThreadPoolExecutor 1)线程池与ThreadPoolExecutor 线程池的实现可能有所不同,但基本概念 ...
- (转)通过 Javacore 诊断线程挂起等性能问题
原文:https://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy ...
- python3 线程 threading.Thread GIL性能详解(2.3)
python3 线程 threading 最基础的线程的使用 import threading, time value = 0 lock = threading.Lock() def change(n ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
随机推荐
- java高级project师须要掌握的技术
1.你须要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该十分了解UML,尤其是class,object,interaction以及statediagra ...
- 知识点1-3:MVC设计模式
MVC代表模型-视图-控制器(Model-View-Controller),起源于20世纪70年代的Smalltalk开发社区,2003年起随着Ruby on Rails的出现才在Web上流行使用. ...
- 基于visual Studio2013解决算法导论之004随机排列数组
题目 随机排列数组 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> # ...
- Makefile学习(二)[第二版]
复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...
- HTML的表单元�
HTML的表单元素 表单元素是同意用户在表单中(比方:文本域,下拉列表,单选框,复选框等等)输入信息的元素 表单标签 文本域(Text Fields) 当用户要在表单中键入字母,数字等内容时,就会用到 ...
- Delphi体系内部的4种消息传递办法(Send,Post,Perform,Dispatch)
一.什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知.例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序发生了 ...
- 6.MIL采集和实时显示
前面讲到的都是离线的图像获取方法,实际中我们做机器视觉都是在线采集图像和处理,处理结果决定了计算机要给出的控制信号如电机运动等,这样就实现了实时视觉反馈运动.MIL中的采集需要Matrox采集板卡的支 ...
- Qt 多线程 详细函数说明及其事例
转:http://www.cnblogs.com/hicjiajia/archive/2011/02/03/1948955.html Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了 ...
- 用内存流 文件流 资源生成客户端(Delphi开源)
正文:很多木马生成器就是用的内存流和文件流生成客户端的,废话不多说了,代码如下: unit Main; interface usesWindows, Messages, SysUtils, Varia ...
- 基于visual Studio2013解决C语言竞赛题之1071打印工资
题目 解决代码及点评 /************************************************************************/ /* ...