首页 > 解决方案 > 在线程之间共享公共数据元素

问题描述

我正在尝试使用 C++ 队列。我知道队列元素可以被现有线程访问,但我想使用相同的队列元素。它将被所有线程使用,例如:我想在 thread1 和 thread2 之间使用相同的视频帧。

一旦它被两个线程处理,我想弹出下一个视频帧。我知道线程将访问单个元素(线程 1 的队列元素 1 和线程 2 的队列元素 2),但我想通过两个线程访问队列元素 1。我无法为两个线程锁定单个缓冲区。

请帮助我在线程之间共享相同的队列元素。

标签: c++c++11

解决方案


您可以将每一帧放入一个信封中,其中包含一个计数器,每次队列弹出时都会减少该计数器: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;
        }
    }
};

推荐阅读