在某些地方,我看到人们创建线程池并创建线程并使用这些线程执行函数。在调用该函数时,boost::mutex 是通过引用传递的。为什么要这样做?我相信您可以在被调用函数本身中声明一个互斥锁,或者可以将其声明为类成员或全局。谁能解释一下?
例如
myclass::processData()
{
boost::threadpool::pool pool(2);
boost::mutex mutex;
for (int i =0; data<maxData; ++data)
pool.schedule(boost::bind(&myClass::getData, boost_cref(*this), boost::ref(mutex)));
}
然后,
myClass::getData(boost::mutex& mutex)
{
boost::scoped_lock(mutex) // Why can't we have class member variable mutex or
//local mutex here
//Do somethign Here
}
最佳答案
Mutex 是不可复制的对象,虽然它们可以是类的成员,但这会使父类的复制能力大大复杂化。因此,如果多个类实例需要共享相同的数据,一种首选方法是将互斥体创建为静态数据成员。否则,如果只需要将互斥锁锁定在类本身的一个实例中,您可以创建一个指向互斥锁的指针作为非静态数据成员,然后该类的每个拷贝都将拥有自己动态分配的互斥锁(并且如果需要,保持可复制)。
在上面的代码示例中,基本上发生的事情是有一个全局互斥锁通过引用传递到线程池中。这使得共享相同内存位置的所有线程都可以使用完全相同的互斥量在该内存上创建独占锁,而无需管理互斥量本身的不可复制方面的开销。此代码示例中的互斥量也可能是类 myClass
的静态数据成员,而不是通过引用传入的全局互斥量,假设每个线程都需要锁定一些内存可以从每个线程全局访问。
本地互斥量的问题在于它只是互斥量的本地可访问版本...因此当线程锁定互斥量以共享一些全局可访问数据时,数据本身不 protected ,因为每个其他线程将拥有自己的本地互斥锁,可以锁定和解锁。它破坏了相互排斥的全部意义。
关于c++ - 为什么要将 mutex 作为参数传递给线程调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555321/