Boost :: Mutex在类中不是线程安全的

时间:2012-07-24 21:18:56

标签: c++ oop boost-mutex

我正在学习并发编程,我想要做的是有一个类,每个对象负责运行自己的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();
    }
}

1 个答案:

答案 0 :(得分:11)

这会创建一个立即销毁的临时文件:

boost::mutex::scoped_lock(this->ticketSaleMutex);

导致无法同步。您需要声明一个变量:

boost::mutex::scoped_lock local_lock(this->ticketSaleMutex);