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