2016-02-28 3 views
3

Я использую очередь с моделью производителя-потребителя в своей программе. У меня есть один поток, который хранит данные очереди в очереди, а один поток сохраняет данные очереди из очереди. Мой вопрос: нужен ли мне блокировка мьютекса для этого сценария при выполнении операции очереди или деактивации? Это необходимо? Я вижу необходимость в мьютексе, если у меня более одного потока на стороне производителя или потребителя, но я не уверен, что это необходимо для моего дела.C++ queue with 2 threads

Мой код выглядит следующим образом:

template <class T> 
class myqueue { 
private: 

    queue<T> localqueue; 
    boost::mutex insert; 

public: 
    myqueue(){} 
    ~myqueue(){} 
    void enqueue(T in_value) { 
     boost::mutex::scoped_lock insert_lock = boost::mutex::scoped_lock(
       this->insert); 
     localqueue.push(in_value); 
     insert_lock.unlock(); 
    } 

ответ

4

Да, вы должны защитить enqueuing и извлечение из с взаимной блокировкой, если вы хотите, чтобы избежать гонки условий, которые могут привести к UB.

+1

Примечания не только enqueuing и извлечение из должно быть заблокировано - Там более сложные проблемы, помимо тех, которые, как недействительные итераторы и размером *) * проблемы (. Я не уверен, что очередь STL является лучшей отправной точкой для реализации потоков связи. – tofro

1

с Ingle р roduce с Ingle с onsumer может быть сделано lockfree. Попробуйте boost::lockfree::spsc_queue, что явно для этого сценария.

boost::lockfree::spsc_queue 
    a wait-free single-producer/single-consumer queue (commonly known as ringbuffer) 
+1

Обратите внимание, что одним из требований, предъявляемых к реализации без блокировки, является то, что максимальный возможный размер очереди должен быть указан заранее (т. Е. Очередь не может быть изменена больше, когда очередь используется, поскольку нет безопасного способа сделать поэтому без использования блокировки) –

1

Чтение/запись очереди параллельно может привести к условиям гонки.

Итак, для каждой операции, которая модифицирует/считывает очередь, требуется мьютекс.

The following article is about consumer-producer queue