@@ -9,15 +9,16 @@ export module leetcode_test.print_foobar_alternately.BlockingQueue;
9
9
using namespace std ;
10
10
namespace leetcode_test ::print_foobar_alternately {
11
11
12
- export template <class E > class BlockingQueue {
12
+ export template <class E >
13
+ class BlockingQueue {
13
14
14
- private:
15
+ private:
15
16
queue<E> _queue;
16
17
int capacity = INT_MAX;
17
18
condition_variable takeVariable, putVariable;
18
19
mutable mutex lock;
19
20
20
- public:
21
+ public:
21
22
BlockingQueue ();
22
23
/* *
23
24
*
@@ -29,13 +30,13 @@ export template <class E> class BlockingQueue {
29
30
* @param e
30
31
* @return -1失败, 0成功
31
32
*/
32
- int take (E & e);
33
+ int take (E& e);
33
34
/* *
34
35
* size >= capacity时会阻塞
35
36
* @param e
36
37
* @return
37
38
*/
38
- int put (const E & e);
39
+ int put (const E& e);
39
40
40
41
bool empty () const ;
41
42
@@ -48,12 +49,18 @@ export template <class E> class BlockingQueue {
48
49
E front ();
49
50
};
50
51
51
- template <class E > BlockingQueue<E>::BlockingQueue() {}
52
+ template <class E >
53
+ BlockingQueue<E>::BlockingQueue() { }
52
54
53
55
template <class E >
54
- BlockingQueue<E>::BlockingQueue(int capacity) : capacity(capacity) {}
56
+ BlockingQueue<E>::BlockingQueue(int capacity)
57
+ : capacity(capacity)
58
+ {
59
+ }
55
60
56
- template <class E > int BlockingQueue<E>::take(E &e) {
61
+ template <class E >
62
+ int BlockingQueue<E>::take(E& e)
63
+ {
57
64
unique_lock<mutex> uniqueLock (lock);
58
65
while (_queue.empty ()) {
59
66
takeVariable.wait (uniqueLock);
@@ -66,7 +73,9 @@ template <class E> int BlockingQueue<E>::take(E &e) {
66
73
return 0 ;
67
74
}
68
75
69
- template <class E > int BlockingQueue<E>::put(const E &e) {
76
+ template <class E >
77
+ int BlockingQueue<E>::put(const E& e)
78
+ {
70
79
unique_lock<mutex> uniqueLock (lock);
71
80
while (_queue.size () >= capacity) {
72
81
putVariable.wait (uniqueLock);
@@ -78,28 +87,38 @@ template <class E> int BlockingQueue<E>::put(const E &e) {
78
87
return 0 ;
79
88
}
80
89
81
- template <class E > bool BlockingQueue<E>::empty() const {
90
+ template <class E >
91
+ bool BlockingQueue<E>::empty() const
92
+ {
82
93
lock_guard<mutex> lockGuard (lock);
83
94
return _queue.empty ();
84
95
}
85
96
86
- template <class E > unsigned int BlockingQueue<E>::size() const {
97
+ template <class E >
98
+ unsigned int BlockingQueue<E>::size() const
99
+ {
87
100
lock_guard<mutex> lockGuard (lock); // 利用变量作用域创建加锁,析构自动解锁
88
101
return _queue.size ();
89
102
}
90
103
91
- template <class E > void BlockingQueue<E>::pop() {
104
+ template <class E >
105
+ void BlockingQueue<E>::pop()
106
+ {
92
107
lock.lock ();
93
108
_queue.pop ();
94
109
lock.unlock ();
95
110
}
96
111
97
- template <class E > E BlockingQueue<E>::back() {
112
+ template <class E >
113
+ E BlockingQueue<E>::back()
114
+ {
98
115
lock_guard<mutex> lockGuard (lock);
99
116
return _queue.back ();
100
117
}
101
118
102
- template <class E > E BlockingQueue<E>::front() {
119
+ template <class E >
120
+ E BlockingQueue<E>::front()
121
+ {
103
122
lock_guard<mutex> lockGuard (lock);
104
123
return _queue.front ();
105
124
}
0 commit comments