[英]Boost::Mutex in class not thread-safe
我正在學習並發編程,我想要做的是有一個類,每個對象負責運行自己的Boost:Thread。 我對這段代碼略勝一籌,因為它使用了很多我不太熟悉的功能(動態分配內存,函數指針,並發等等)。 這就像每行代碼我必須檢查一些引用才能使它正確。
(是的,在實際代碼中考慮了所有分配的內存!)
我遇到了互斥體問題。 我聲明它是靜態的,它似乎為所有實例獲得相同的值(應該如此)。 代碼仍然不是線程安全的。
互斥鎖應該阻止線程(右邊?)進一步前進以防其他人鎖定它。 因為互斥量是作用域的(一種簡潔的功能)並且它在if語句中應該看其他線程沒有? 我仍然得到控制台輸出,明確暗示它不是線程安全的。
此外,我不確定我是否正在使用靜態可變權利。 我嘗試了不同的方式來引用它(Seller :: ticketSaleMutex),但唯一有效的是“this-> ticketSaleMutex”,這看起來非常陰暗,似乎打敗了靜態的目的。
Seller.h:
class Seller
{
public:
//Some vaiables
private:
//Other variables
static boost::mutex ticketSaleMutex; //Mutex definition
};
Seller.cpp:
boost::mutex Seller::ticketSaleMutex; //Mutex declaration
void Seller::StartTicketSale()
{
ticketSale = new boost::thread(boost::bind(&Seller::SellTickets, this));
}
void Seller::SellTickets()
{
while (*totalSoldTickets < totalNumTickets)
{
if ([Some time tick])
{
boost::mutex::scoped_lock(this->ticketSaleMutex);
(*totalSoldTickets)++;
std::cout << "Seller " << ID << " sold ticket " << *totalSoldTickets << std::endl;
}
}
}
main.cpp中:
int main(int argc, char**argv)
{
std::vector<Seller*> seller;
const int numSellers = 10;
int numTickets = 40;
int *soldTickets = new int;
*soldTickets = 0;
for (int i = 0; i < numSellers; i++)
{
seller.push_back(new Seller(i, numTickets, soldTickets));
seller[i]->StartTicketSale();
}
}
這將創建一個立即銷毀的臨時文件:
boost::mutex::scoped_lock(this->ticketSaleMutex);
導致沒有同步。 你需要聲明一個變量:
boost::mutex::scoped_lock local_lock(this->ticketSaleMutex);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.