Совместное использование общего элемента данных между потоками - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать очередь C ++. Я знаю, что элемент очереди может быть доступен для существующих потоков, но я хочу использовать тот же элемент очереди. Он будет использоваться всеми потоками, например, одним и тем же видеокадром, который я хочу использовать между потоками 1 и 2.

Как только он будет обработан двумя потоками, я хочу выложить следующий видеокадр. Я знаю, что потоки будут обращаться к отдельным элементам (элемент очереди 1 потоком 1 и элемент очереди 2 потоком 2), но я хочу получить доступ к элементу очереди 1 в обоих потоках. Я не могу заблокировать один буфер для обоих потоков.

Пожалуйста, помогите мне разделить один и тот же элемент очереди между потоками.

1 Ответ

1 голос
/ 22 апреля 2019

Вы можете поместить каждый кадр в конверт, содержащий счетчик, который вы уменьшаете каждый раз, когда очередь появляется: 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;
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...