簡體   English   中英

Boost :: Mutex在類中不是線程安全的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM