Минимальные мьютексы для производителя/потребителя std::queueC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Минимальные мьютексы для производителя/потребителя std::queue

Сообщение Anonymous »

У меня есть два потока, которые работают со стороны производителя и потребителя std::queue. Очередь не всегда заполнена, поэтому я бы не хотел, чтобы потребитель захватывал мьютекс, который защищает очередь от изменения.
Можно ли вызывать пустую() вне мьютекса, а затем захватывать мьютекс только в том случае, если что-то есть в очереди?
Например:

Код: Выделить всё

struct MyData{
int a;
int b;
};

class SpeedyAccess{
public:
void AddDataFromThread1(MyData data){
const std::lock_guard queueMutexLock(queueAccess);
workQueue.push(data);
}

void CheckFromThread2(){
if(!workQueue.empty()) // Un-protected access...is this dangerous?
{
queueAccess.lock();
MyData data = workQueue.front();
workQueue.pop();
queueAccess.unlock();

ExpensiveComputation(data);
}

}

private:
void ExpensiveComputation(MyData& data);

std::queue workQueue;
std::mutex queueAccess;
}
Поток 2 выполняет проверку и не особо критичен ко времени, но будет вызываться часто (500/сек?). Поток 1 очень критичен по времени, там нужно запускать много вещей, но он вызывается не так часто (максимум 20/сек).
Если я добавлю защиту мьютекса вокруг пустого( ), если очередь пуста, когда приходит поток 2, мьютекс не будет удерживаться долго, поэтому это может не иметь большого успеха. Однако, поскольку он вызывается так часто, иногда это может произойти в то же время, когда что-то пытается поместить на спину.... приведет ли это к значительному ожиданию в потоке 1?

Подробнее здесь: https://stackoverflow.com/questions/722 ... r-consumer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»