java高性能阻塞队列,Linux c/c 后台开发组建之:高性能阻塞队列
Linux?c/c???后臺開發組建之:高性能阻塞隊列
(2015-12-01 06:01:47)
標簽:
Linux
c/c
雜談
分類:
c/c
阻塞隊列是后臺開發中多線程異步架構的基本數據結構,像python, java 都提供線程安全的阻塞隊列,c
可能需要自己實現一個模板。
從性能考慮,自己沒有使用STL的queue作為基本數據結構,而是使用循環數組作為基本數據結構,性能應該比queue高,省去了動態內存分配和回收。
確點就是,隊列大小不可動態擴展,當時實際開發中,可以通過壓力測試和內存的限制,配置合適的隊列大小來滿足應用需求。
#ifndef BLOCK_QUEUE_H
#define BLOCK_QUEUE_H
#include
#include
#include
#include
using namespace std;
template
class block_queue
{
public:
block_queue(int max_size = 1000)
{
if(max_size <= 0)
{
exit(-1);
}
m_max_size = max_size;
m_array = new T[max_size];
m_size = 0;
m_front = -1;
m_back = -1;
m_mutex = new pthread_mutex_t;
m_cond = new pthread_cond_t;
pthread_mutex_init(m_mutex, NULL);
pthread_cond_init(m_cond, NULL);
}
void clear()
{
pthread_mutex_lock(m_mutex);
m_size = 0;
m_front = -1;
m_back = -1;
pthread_mutex_unlock(m_mutex);
}
~block_queue()
{
pthread_mutex_lock(m_mutex);
if(m_array != NULL)
delete m_array;
pthread_mutex_unlock(m_mutex);
pthread_mutex_destroy(m_mutex);
pthread_cond_destroy(m_cond);
delete m_mutex;
delete m_cond;
}
bool full()const
{
pthread_mutex_lock(m_mutex);
if(m_size >= m_max_size)
{
pthread_mutex_unlock(m_mutex);
return true;
}
pthread_mutex_unlock(m_mutex);
return false;
}
bool empty()const
{
pthread_mutex_lock(m_mutex);
if(0 == m_size)
{
pthread_mutex_unlock(m_mutex);
return true;
}
pthread_mutex_unlock(m_mutex);
return false;
}
bool front(T& value)const
{
pthread_mutex_lock(m_mutex);
if(0 == m_size)
{
pthread_mutex_unlock(m_mutex);
return false;
}
value = m_array[m_front];
pthread_mutex_unlock(m_mutex);
return true;
}
bool back(T& value)const
{
pthread_mutex_lock(m_mutex);
if(0 == m_size)
{
pthread_mutex_unlock(m_mutex);
return false;
}
value = m_array[m_back];
pthread_mutex_unlock(m_mutex);
return true;
}
int size()const
{
int tmp = 0;
pthread_mutex_lock(m_mutex);
tmp = m_size;
pthread_mutex_unlock(m_mutex);
return tmp;
}
int max_size()const
{
int tmp = 0;
pthread_mutex_lock(m_mutex);
tmp = m_max_size;
pthread_mutex_unlock(m_mutex);
return tmp;
}
bool push(const T& item)
{
pthread_mutex_lock(m_mutex);
if(m_size >= m_max_size)
{
pthread_cond_broadcast(m_cond);
pthread_mutex_unlock(m_mutex);
return false;
}
m_back = (m_back 1) % m_max_size;
m_array[m_back] = item;
m_size ;
pthread_cond_broadcast(m_cond);
pthread_mutex_unlock(m_mutex);
return true;
}
bool pop(T& item)
{
pthread_mutex_lock(m_mutex);
while(m_size <= 0)
{
if(0 != pthread_cond_wait(m_cond, m_mutex))
{
pthread_mutex_unlock(m_mutex);
return false;
}
}
m_front = (m_front 1) % m_max_size;
item = m_array[m_front];
m_size--;
pthread_mutex_unlock(m_mutex);
return true;
}
bool pop(T& item, int ms_timeout)
{
struct timespec t = {0,0};
struct timeval now = {0,0};
gettimeofday(&now, NULL);
pthread_mutex_lock(m_mutex);
if(m_size <= 0)
{
t.tv_sec = now.tv_sec ms_timeout/1000;
t.tv_nsec = (ms_timeout % 1000)*1000;
if(0 != pthread_cond_timedwait(m_cond, m_mutex,
&t))
{
pthread_mutex_unlock(m_mutex);
return false;
}
}
if(m_size <= 0)
{
pthread_mutex_unlock(m_mutex);
return false;
}
m_front = (m_front 1) % m_max_size;
item = m_array[m_front];m_size--;
pthread_mutex_unlock(m_mutex);
return true;
}
private:
pthread_mutex_t *m_mutex;
pthread_cond_t *m_cond;
T *m_array;
int m_size;
int m_max_size;
int m_front;
int m_back;
};
#endif
#include
#include"block_queue.h"
using namespace std;
block_queue g_queue(100);
void *p(void *args)
{
sleep(1);
int data = 0;
for(int i = 0; i < 100; i )
{
g_queue.push(data );
}
return NULL;
}
void *c(void* args)
{
while(true)
{
int t = 0;
if(!g_queue.pop(t,1000))
{
cout<
continue;
}
else
{
cout<
}
g_queue.pop(t);
cout<
}
return NULL;
}
int main()
{
pthread_t id;
pthread_create(&id, NULL, p, NULL);
//pthread_create(&id, NULL, p, NULL);
//pthread_create(&id, NULL, c, NULL);
pthread_create(&id, NULL, c, NULL);
for(;;)sleep(1);
return 0;
}
分享:
喜歡
0
贈金筆
加載中,請稍候......
評論加載中,請稍候...
發評論
登錄名: 密碼: 找回密碼 注冊記住登錄狀態
昵???稱:
發評論
以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。
總結
以上是生活随笔為你收集整理的java高性能阻塞队列,Linux c/c 后台开发组建之:高性能阻塞队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppo手机视频通话特效在哪里(OPPO
- 下一篇: qq会员加速卡怎么使用(PC版官方网站)