@@ -33,15 +33,14 @@ using namespace std;
33
33
#include < vector>
34
34
#include < mutex>
35
35
#include < condition_variable>
36
- #include < cstring> // 用于memcpy
36
+ #include < cstring> // memcpy
37
37
38
38
39
39
template <typename T>
40
40
class CircularQueue {
41
41
public:
42
42
explicit CircularQueue (size_t capacity) : capacity_(capacity), queue_(capacity){}
43
43
44
- // 阻塞连续块写入
45
44
public:
46
45
bool enqueue (const void * pdata, size_t blockSize) {
47
46
int retry = 2 ;
@@ -51,35 +50,30 @@ class CircularQueue {
51
50
// std::cout << readIndex_ << " " << writeIndex_ << std::endl;
52
51
// std::cout << size_ << std::endl;
53
52
54
- // 使用lambda函数来判断容量是否足够
55
53
auto isCapacityEnough = [&]() {
56
- return ((capacity_- size_) >= blockSize);
54
+ return ((capacity_ - size_) >= blockSize);
57
55
};
58
56
59
-
60
57
volatile bool status = conditionVariable_.wait_for (lock, std::chrono::microseconds (100 ), isCapacityEnough);
61
-
62
58
if (status == false )
63
59
{
64
60
lock.unlock ();
65
61
std::cout << " [enqueue] timeout" << std::endl;
66
62
return false ;
67
63
}
68
64
69
- // 执行连续写入
70
65
size_t remainingSpace = capacity_ - writeIndex_;
71
66
size_t dataSize = blockSize * sizeof (T);
72
67
73
68
if (dataSize <= remainingSpace * sizeof (T)) {
74
- // 数据不跨越队列尾部
75
69
std::memcpy (&queue_[writeIndex_], pdata, dataSize);
76
- } else {
77
- // 数据跨越队列尾部
70
+ }
71
+ else {
78
72
size_t firstPartSize = remainingSpace * sizeof (T);
79
- std::memcpy (&queue_[writeIndex_], (char *)pdata, firstPartSize);
73
+ std::memcpy (&queue_[writeIndex_], (char *)pdata, firstPartSize);
80
74
81
75
size_t secondPartSize = dataSize - firstPartSize;
82
- std::memcpy (&queue_[0 ], (char *)((T *)pdata + remainingSpace), secondPartSize);
76
+ std::memcpy (&queue_[0 ], (char *)((T*)pdata + remainingSpace), secondPartSize);
83
77
}
84
78
85
79
writeIndex_ = (writeIndex_ + blockSize) % capacity_;
@@ -89,20 +83,18 @@ class CircularQueue {
89
83
// std::cout << "After enqueue" << std::endl;
90
84
// std::cout << readIndex_ << " " << writeIndex_ << std::endl;
91
85
// std::cout << size_ << std::endl;
92
- conditionVariable_.notify_one (); // 通知读取线程数据已经可用
86
+ conditionVariable_.notify_one ();
93
87
94
88
return true ;
95
- }
89
+ };
96
90
97
- // 阻塞连续块读出
98
91
bool dequeue (void * pdata, size_t blockSize) {
99
92
std::unique_lock<std::mutex> lock (mutex_);
100
93
101
94
// std::cout << "Before dequeue" << std::endl;
102
95
// std::cout << readIndex_ << " " << writeIndex_ << std::endl;
103
96
// std::cout << size_ << std::endl;
104
97
105
- // 使用lambda函数来判断容量是否足够
106
98
auto isCapacityEnough = [&]() {
107
99
return size_ >= blockSize;
108
100
};
@@ -120,10 +112,8 @@ class CircularQueue {
120
112
size_t dataSize = blockSize * sizeof (T);
121
113
122
114
if (dataSize <= remainingData * sizeof (T)) {
123
- // 数据不跨越队列尾部
124
115
std::memcpy ((char *)pdata, &queue_[readIndex_], dataSize);
125
116
} else {
126
- // 数据跨越队列尾部
127
117
size_t firstPartSize = remainingData * sizeof (T);
128
118
std::memcpy ((char *)pdata, &queue_[readIndex_], firstPartSize);
129
119
@@ -138,24 +128,21 @@ class CircularQueue {
138
128
// std::cout << "After dequeue" << std::endl;
139
129
// std::cout << readIndex_ << " " << writeIndex_ << std::endl;
140
130
// std::cout << size_ << std::endl;
141
- conditionVariable_.notify_one (); // 通知写入线程队列有足够空间
131
+ conditionVariable_.notify_one ();
142
132
143
133
return true ;
144
134
}
145
135
146
- // 判断队列是否为空
147
136
bool empty () {
148
137
std::unique_lock<std::mutex> lock (mutex_);
149
138
return size_ == 0 ;
150
139
}
151
140
152
- // 判断队列是否已满
153
141
bool full () {
154
142
std::unique_lock<std::mutex> lock (mutex_);
155
143
return size_ == capacity_;
156
144
}
157
145
158
- // 获取队列中元素的数量
159
146
size_t size () {
160
147
std::unique_lock<std::mutex> lock (mutex_);
161
148
return size_;
0 commit comments