日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

java高性能阻塞队列,Linux c/c   后台开发组建之:高性能阻塞队列

發布時間:2023/12/19 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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   后台开发组建之:高性能阻塞队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。