小知识:Linux C++ 使用condition实现阻塞队列的方法

实例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* BlockingQueue.h
*
* Created on: 2014年6月10日
*   Author:
*/
#ifndef BLOCKINGQUEUE_H_
#define BLOCKINGQUEUE_H_
#include <iostream>
#include <pthread.h>
using namespace std;
//template <typename T >
class BlockingQueue
{
public:
BlockingQueue();
BlockingQueue(int capacity);
~BlockingQueue();
bool push(int item);
int poll();
private:
int capacity;
int* queue;
int head,tail;
pthread_mutex_t mutex;
pthread_cond_t notFull,notEmpty;
};
#endif /* BLOCKINGQUEUE_H_ */
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* BlockingQueue.cpp
*
*  Created on: 2014年6月10日
*      Author:
*/
#include “../include/BlockingQueue.h”
BlockingQueue::BlockingQueue()
{
this->capacity = 10;
queue = new int[capacity];
head = 0,tail = 0;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&notFull,NULL);
pthread_cond_init(&notEmpty,NULL);
}
BlockingQueue::BlockingQueue(int capacity)
{
this->capacity = capacity;
queue = new int[capacity];
cout << “capacity ” << sizeof(queue) << endl;
head = 0,tail = 0;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&notFull,NULL);
pthread_cond_init(&notEmpty,NULL);
}
BlockingQueue::~BlockingQueue()
{
this->capacity = 0;
head = 0,tail = 0;
delete queue;
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&notFull);
pthread_cond_destroy(&notEmpty);
}
bool BlockingQueue::push(int item)
{
pthread_mutex_lock(&mutex);
cout << “you want push ” << item << endl;
while((head + 1) % capacity == tail)//is full
{
cout << “is full,wait…” << endl;
// push wait
pthread_cond_wait(&notFull,&mutex);
cout << “not full,unlock” << endl;
}
{
queue[head] = item;
head = (head + 1) % capacity;
cout << “push ” << item << endl;
//wake up poll thread
pthread_cond_signal(&notEmpty);
pthread_mutex_unlock(&mutex);
return true;
}
}
int BlockingQueue::poll()
{
pthread_mutex_lock(&mutex);
int ret = 0;
while(head == tail) // is empty
{
cout << “is empty,wait…” << endl;
//poll wait
pthread_cond_wait(&notEmpty,&mutex);
cout << “not empty,unlock…” << endl;
}
{
ret = queue[tail];
tail = (tail + 1) % capacity;
cout << “take ” << ret << endl;
//wake up push thread
pthread_cond_signal(&notFull);
pthread_mutex_unlock(&mutex);
return ret;
}
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include “include/BlockingQueue.h”
using namespace std;
BlockingQueue queue(3);
void* put(void *)
{
queue.push(1);
queue.push(2);
queue.push(3);
queue.push(4);
queue.push(5);
return NULL;
}
void* take(void *)
{
queue.poll();
queue.poll();
queue.poll();
return NULL;
}
int main() {
pthread_t put1,take1;
pthread_create(&put1,NULL,put,0);
pthread_create(&take1,NULL,take,0);
void * retval;
pthread_join(put1,&retval);
pthread_join(take1,&retval);
return 0;
}

以上就是小编为大家带来的Linux C++ 使用condition实现阻塞队列的方法全部内容了,希望大家多多支持服务器之家~

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Nginx配置如何区分PC或手机访问不同域名

2023-4-11 5:15:52

建站知识

小知识:关于g++和gcc的相同点和区别详解

2023-4-11 5:32:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索