Можно ли вызывать пустую() вне мьютекса, а затем захватывать мьютекс только в том случае, если что-то есть в очереди?
Например:
Код: Выделить всё
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, мьютекс не будет удерживаться долго, поэтому это может не иметь большого успеха. Однако, поскольку он вызывается так часто, иногда это может произойти в то же время, когда что-то пытается поместить на спину.... приведет ли это к значительному ожиданию в потоке 1?
Подробнее здесь: https://stackoverflow.com/questions/722 ... r-consumer