Как бы я добавил переменную условия здесь? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь добавить переменную условия в мой код, который использует шаблон фермерства, но я не могу понять, где его использовать. Я думал, что мог бы использовать условную переменную для приостановки потоков, пока они не используются. Кто-нибудь может показать мне пример или указать правильное направление?

Когда я попытался, проверив, пустые ли задачи, меня просто оставили "в ожидании"

Farm.cpp

void Farm::run()
{
    //list<thread *> threads;
    vector<thread *> threads;

    for (int i = 0; i < threadCount; i++)
    {
        threads.push_back(new thread([&]
        {
            while (!taskQ.empty())
            {

                taskMutex.lock();
                RowTask* temp = taskQ.front();
                taskQ.pop();
                taskMutex.unlock();
                temp->run(image_);
                delete temp;
            }

            return;
        }));
    }

    for (auto i : threads)
    {
        i->join();
    }
}

1 Ответ

0 голосов
/ 30 апреля 2019

Основная идея для реализации очереди с использованием условной переменной:

#include <queue>
#include <mutex>
#include <condition_variable>

template<typename T>
class myqueue {
    std::queue<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(); // use the condition variable to signal threads waiting on it
        return rv;
    }

    T pop() {
        std::unique_lock<std::mutex> lock(mtx_data);
        while(data.size() == 0) cv_data.wait(lock); // wait to get a signal
        T rv = std::move(data.front());
        data.pop();
        return rv;
    }
};
...