Linux C++ 使用condition实现阻塞队列的方法

时间:2021-09-10 01:29:18

实例如下:

?
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实现阻塞队列的方法全部内容了,希望大家多多支持服务器之家~