c++ - 在线程之间共享公共数据元素
问题描述
我正在尝试使用 C++ 队列。我知道队列元素可以被现有线程访问,但我想使用相同的队列元素。它将被所有线程使用,例如:我想在 thread1 和 thread2 之间使用相同的视频帧。
一旦它被两个线程处理,我想弹出下一个视频帧。我知道线程将访问单个元素(线程 1 的队列元素 1 和线程 2 的队列元素 2),但我想通过两个线程访问队列元素 1。我无法为两个线程锁定单个缓冲区。
请帮助我在线程之间共享相同的队列元素。
解决方案
您可以将每一帧放入一个信封中,其中包含一个计数器,每次队列弹出时都会减少该计数器:ed。当计数器达到零时,您删除该元素。例子:
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;
}
}
};
推荐阅读
- java - 如何在代理类上获取方法注释?
- c# - 异常代码 0xe0434352 崩溃 w3wp.exe | 点网运行
- mysql - 使用黑洞引擎的mysql主主复制
- docker - 如何使tomcat(url = ip:port)自动转到我的应用程序而不是根文件
- postgresql - 将字段上的值转换为新值以作为键加入 PostgreSQL
- c# - 为什么每次使用此身份验证过程都必须重新登录
- mysql - 如何根据 ID 从另一个表的单个字段中获取每一行的所有结果
- html - 如何修复'$'modal bootstrap未定义?
- c# - 如何使用 ADO.NET 将 API 中的 json 插入雪花数据库?
- java - 在 while 循环中验证 isDisplayed() WebElement 属性