我正在開發一個模擬加油站的程序。車站的每輛車都是自己的線程。每輛車必須通過一個位掩碼循環檢查泵是否打開,如果是,則更新位掩模,填滿並通知其他車輛泵已打開。我目前的代碼工作正常,但有一些負載平衡問題。理想情況下,所有泵的使用量相同,所有汽車的填充量相同。線程和互斥體
編輯:我的程序基本上需要一些汽車,水泵和一段時間來運行測試。在此期間,汽車會通過不斷調用此功能來檢查打開的泵。
int Station::fillUp()
{
// loop through the pumps using the bitmask to check if they are available
for (int i = 0; i < pumpsInStation; i++)
{
//Check bitmask to see if pump is open
stationMutex->lock();
if ((freeMask & (1 << i)) == 0)
{
//Turning the bit on
freeMask |= (1 << i);
stationMutex->unlock();
// Sleeps thread for 30ms and increments counts
pumps[i].fillTankUp();
// Turning the bit back off
stationMutex->lock();
freeMask &= ~(1 << i);
stationCondition->notify_one();
stationMutex->unlock();
// Sleep long enough for all cars to have a chance to fill up first.
this_thread::sleep_for(std::chrono::milliseconds((((carsInStation-1) * 30)/pumpsInStation)-30));
return 1;
}
stationMutex->unlock();
}
// If not pumps are available, wait until one becomes available.
stationCondition->wait(std::unique_lock<std::mutex>(*stationMutex));
return -1;
}
我覺得這個問題與我讀取它時鎖定位掩模有關。我需要在if檢查時使用某種互斥或鎖定嗎?
如果我正確理解代碼的方式,它只有一個汽車使用的泵?是對的嗎 ? –
@TasosVogiatzoglou不,有多個泵,但不是每個泵對象上都有一個可用的布爾值,站內只有一個int值,用作泵的位掩碼。 – user3334986
您在負載平衡中觀察到的模式是什麼? –