C++ 11 ориентированных на многопотоковое исполнение очередей

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

// qMutex is a std::mutex intended to guard the queue
// populatedNotifier is a std::condition_variable intended to
//                   notify waiting threads of a new item in the queue

void FileQueue::enqueue(std::string&& filename)
{
    std::lock_guard<std::mutex> lock(qMutex);
    q.push(std::move(filename));

    // Notify anyone waiting for additional files that more have arrived
    populatedNotifier.notify_one();
}

std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout)
{
    std::unique_lock<std::mutex> lock(qMutex);
    if (q.empty()) {
        if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::no_timeout) {
            std::string ret = q.front();
            q.pop();
            return ret;
        }
        else {
            return std::string();
        }
    }
    else {
        std::string ret = q.front();
        q.pop();
        return ret;
    }
}

Однако я иногда segfaulting в if (...wait_for(lock, timeout) == std::cv_status::no_timeout) { } блок и контроль в gdb указывают, что segfaults происходят, потому что очередь пуста. Как это возможно? Это было мое понимание это wait_for только возвраты cv_status::no_timeout когда это было уведомлено, и это должно только произойти после FileQueue::enqueue только что продвинул новый объект очереди.

62
задан 15 December 2016 в 00:49

3 ответа

BlockingCollection является C++ 11 ориентированных на многопотоковое исполнение классов набора, которые оказывают поддержку для очереди, стека и приоритетных контейнеров. Это обрабатывает "пустой" сценарий очереди, который Вы описали. А также "полная" очередь.

1
ответ дан 31 October 2019 в 14:02

Можно понравиться lfqueue, https://github.com/Taymindis/lfqueue. It’s блокируют свободную параллельную очередь. I’m в настоящее время с помощью него для потребления очереди от нескольких входящих вызовов и работ как очарование.

0
ответ дан 31 October 2019 в 14:02

Существует также Бойкое решение для этого случая, я еще не попробовал его, но я полагаю, что это - хорошее решение. https://developer.gnome.org/glib/2.36/glib-Asynchronous-Queues.html#g-async-queue-new

1
ответ дан 31 October 2019 в 14:02

Другие вопросы по тегам:

Похожие вопросы: