载入中...
搜索中...
未找到
Channel.cpp
浏览该文件的文档.
1#include "thread/Channel.h"
2
3#include <chrono>
4
5namespace eve {
6namespace thread {
7
8Channel::Channel() : state_(std::make_shared<State>()) {}
9
10Channel::Channel(std::string name) : state_(std::make_shared<State>(std::move(name))) {}
11
12Channel::~Channel() = default;
13
14std::string Channel::getName() const { return state_->name; }
15
16void Channel::push(std::string value) {
17 {
18 std::lock_guard<std::mutex> lock(state_->mu);
19 state_->queue.push(std::move(value));
20 }
21 state_->cv.notify_one();
22}
23
24std::string Channel::pop() {
25 std::lock_guard<std::mutex> lock(state_->mu);
26 if (state_->queue.empty())
27 return {};
28 std::string v = std::move(state_->queue.front());
29 state_->queue.pop();
30 return v;
31}
32
33std::string Channel::demand() {
34 auto state = state_;
35 std::unique_lock<std::mutex> lock(state->mu);
36 state->cv.wait(lock, [&state] { return !state->queue.empty(); });
37 std::string v = std::move(state->queue.front());
38 state->queue.pop();
39 return v;
40}
41
42std::string Channel::supply(int timeoutMs) {
43 auto state = state_;
44 std::unique_lock<std::mutex> lock(state->mu);
45 if (timeoutMs < 0)
46 timeoutMs = 0;
47 if (!state->cv.wait_for(lock, std::chrono::milliseconds(timeoutMs), [&state] { return !state->queue.empty(); }))
48 return {};
49 std::string v = std::move(state->queue.front());
50 state->queue.pop();
51 return v;
52}
53
54bool Channel::hasData() const {
55 std::lock_guard<std::mutex> lock(state_->mu);
56 return !state_->queue.empty();
57}
58
59int Channel::getCount() const {
60 std::lock_guard<std::mutex> lock(state_->mu);
61 return static_cast<int>(state_->queue.size());
62}
63
65 std::lock_guard<std::mutex> lock(state_->mu);
66 while (!state_->queue.empty())
67 state_->queue.pop();
68}
69
70} // namespace thread
71} // namespace eve
std::string value
JobSystemThreadPool::State * state
const char * name
Definition RockMesh.cpp:21
int v
void push(std::string value)
Definition Channel.cpp:16
bool hasData() const
Definition Channel.cpp:54
std::string pop()
Non-blocking pop; returns "" if empty.
Definition Channel.cpp:24
std::string demand()
Block until a value is available, then pop it.
Definition Channel.cpp:33
int getCount() const
Definition Channel.cpp:59
std::string getName() const
Definition Channel.cpp:14
std::string supply(int timeoutMs)
Block up to timeoutMs; returns "" on timeout.
Definition Channel.cpp:42
Definition Build.cpp:11