我正在尝试使用c ++队列。我知道现有线程可以访问队列元素,但是我想使用相同的队列元素。所有线程都会使用它,例如:我想在线程1和线程2之间使用的同一视频帧。
一旦由两个线程处理,我想弹出下一个视频帧。我知道线程将访问单个元素(通过线程1访问队列元素1,通过线程2访问队列元素2),但是我想通过两个线程访问队列元素1。我无法为两个线程锁定单个缓冲区。
请帮助我在线程之间共享相同的队列元素。
答案 0 :(得分:1)
您可以将每个帧放在包含计数器的信封中,每次弹出队列时,计数器都会减少。当计数器达到零时,将删除该元素。示例:
struct envelope_t {
int count;
frame_t frame;
envelope_t(const frame_t& f) : count(2), frame(f) {}
};
class myqueue {
std::queue<envelope_t> data;
std::mutex mtx_data;
std::condition_variable cv_data;
public:
template<class... Args>
decltype(auto) emplace(Args&&... args) {
std::lock_guard<std::mutex> lock(mtx_data);
auto rv = data.emplace(std::forward<Args>(args)...);
cv_data.notify_one();
return rv;
}
frame_t pop() {
std::unique_lock<std::mutex> lock(mtx_data);
while(data.size() == 0) cv_data.wait(lock);
if(--data.front().count) {
cv_data.notify_one();
return data.front().frame;
} else {
auto msg = std::move(data.front().frame);
data.pop();
return msg;
}
}
};