【问题标题】:Boost::Mutex in class not thread-safe类中的 Boost::Mutex 不是线程安全的
【发布时间】:2012-07-24 21:18:55
【问题描述】:

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

    }
}

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();
    }
}

【问题讨论】:

  • Seller::ticketSaleMutex 肯定可以工作。完全等同于this-&gt;ticketSaleMutex
  • "error C2655: 'Seller::ticketSaleMutex' : 在当前范围内定义或重新声明非法" + "error C2371: 'ticketSaleMutex' : 重新定义;不同的基本类型"
  • 这很明显,因为我做错了,当我正确使用互斥锁时它可以工作(如答案)

标签: c++ oop boost-mutex


【解决方案1】:

这将创建一个立即销毁的临时对象:

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

导致不同步。你需要声明一个变量:

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

【讨论】:

  • 让您承担锁定互斥锁的所有开销,而没有任何同步优势。哎哟。
  • 哦,就是这么简单 :D 只是为了表明我需要一次练习一件事,否则只会令人困惑。那一行代码包含了 3 个我以前从未使用过的东西:this 指针、函数指针(当然,因为我使用了 this 指针)和并发。
  • 因为ticketSaleMutexstatic,你也可以使用Seller::ticketSaleMutex。哪个,IMO,更清楚 this-&gt; 使它看起来像一个实例变量(非静态)。
  • 是的,但是当我这样做时出现编译器错误:“错误 C2371:'ticketSaleMutex':重新定义;不同的基本类型”
  • 这很明显,因为我做错了,当我正确使用互斥锁时它可以工作(如答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2013-02-02
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多