gpt4 book ai didi

c++ - 类中的 Boost::Mutex 不是线程安全的

转载 作者:太空狗 更新时间:2023-10-29 19:49:13 25 4
gpt4 key购买 nike

我正在学习并发编程,我想做的是拥有一个类,其中每个对象负责运行自己的 Boost:Thread。我对这段代码有点头疼,因为它使用了很多我不太熟悉的功能(动态分配的内存、函数指针、并发等)。这就像我必须检查一些引用才能确保正确的每一行代码。

(是的,所有分配的内存都在实际代码中!)

我在使用互斥体时遇到了问题。我声明它是静态的,它似乎对所有实例都获得了相同的值(应该如此)。该代码仍然不是线程安全的。

互斥体应该阻止线程(对吗?)继续前进,以防其他人锁定它。因为互斥量是有范围的(一种简洁的功能)并且它在 if 语句中应该查看其他线程不是吗?我仍然得到控制台输出,清楚地表明它不是线程安全的。

此外,我不确定我是否使用了静态变量。我尝试了不同的方式来引用它 (Seller::ticketSaleMutex),但唯一起作用的是“this->ticketSaleMutex”,它看起来很可疑,而且似乎违背了它是静态的目的。

卖家.h:

class Seller
{
public:
//Some vaiables
private:
//Other variables
static boost::mutex ticketSaleMutex; //Mutex definition
};

卖家.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;
}

}
}

主要.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);

关于c++ - 类中的 Boost::Mutex 不是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com