2015-08-26 4 views
1

Я должен реализовать класс в Visual C++ с очередью; в этой очереди я должен выполнять атомарную работу. Поиск в Интернете я нашел класс std :: atomic, но у меня есть некоторые вопросы. Первый: в чем разница между:Атомная операция в очереди <T>?

A) atomic <queue <T>> fifo;

B) queue <atomic <T>> fifo; ?

Второй вопрос: как я могу сделать атомную операцию, например push?

push (T.load) 

- правильное решение?

Последний вопрос: если я защищу некоторую операцию в очереди с помощью мьютекса, все-таки мне нужно выполнить атомную операцию на нем?

Любые советов ценятся, Привет

+0

Какой атомизации вам нужен именно? Что должно быть атомом? –

+0

Спасибо за комментарий. Спецификация моей домашней работы только говорит «атомная», я полагаю, что я должен использовать методы, предлагаемые классом std :: atomic. –

+1

Написание правильной атомной очереди очень сложно. Эксперты мирового класса терпят неудачу. Вы знаете, есть ли у вас один производитель - единственный потребитель? Одиночный производитель - несколько потребителей? Несколько производителей - один потребитель? Несколько производителей - несколько потребителей? Это разные случаи с различными требованиями. – nwp

ответ

5

А) atomic<queue <T>> fifo; не будет даже компиляции, потому что std::atomic требует тривиального Copyable типа

B) будет выполнять атомное чтения или запись типа Т, но операции с очередью (push или pop) не будет атомарным.

Вы должны защитить queue операции с mutex:

template<typename T> 
class my_queue 
{ 
public: 
    void push(const T& value) 
    { 
     std::lock_guard<std::mutex> lock(m_mutex); 
     m_queque.push(value); 
    } 

    void pop() 
    { 
     std::lock_guard<std::mutex> lock(m_mutex); 
     m_queque.pop(); 
    } 

private: 
    std::queue<T> m_queque; 
    mutable std::mutex m_mutex; 
}; 
+0

благодарит за ответ. Итак, по вашему мнению, предложение «вставить и удалить операцию должно быть атомарным» - это то же самое, что «защищать операцию с помощью мьютекса»? –

+1

Если вы защищаете работу с мьютексом, операция будет атомарной. Добавил класс к моему ответу. –

Смежные вопросы