Boost::类中的Mutex不是线程安全的
Boost::Mutex in class not thread-safe
我正在学习并发编程,我想做的是有一个类,每个对象都负责运行自己的Boost:Thread。我对这段代码有点不知所措,因为它使用了很多我不太熟悉的功能(动态分配的内存、函数指针、并发等)。这就像每一行代码我都必须检查一些引用才能正确。
(是的,所有分配的内存都计入真实代码中!)
我的互斥对象有问题。我声明它是静态的,并且它似乎为所有实例获得了相同的值(正如它应该得到的那样)。该代码仍然不是线程安全的。
互斥锁应该阻止线程(对吧?)继续前进,以防其他人锁定它。因为互斥锁是有作用域的(有点巧妙的功能),而且它在if语句中,应该查找其他线程,不是吗?尽管如此,我还是把控制台放了出来,这清楚地表明它不是线程安全的。
此外,我不确定我是否使用了静态有效权限。我尝试了不同的方式来引用它(卖家::ticketSalesMutex),但唯一有效的是"this->ticketSamutex",这似乎很不光彩,似乎违背了它静态的目的。
卖家.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);
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区