C++ 螺纹C++;锁
我需要一些线程同步机制。我想知道下面的实现哪一个更好C++ 螺纹C++;锁,c++,C++,我需要一些线程同步机制。我想知道下面的实现哪一个更好 classA{ public: int sharedResourceA; pthread_mutex_t mutex1; functionA(); int nonSharedResources; } classA::functionA(){ pthread_mutex_lock( &mutex1 ); use sharedResourceA; pthread_mutex_unlock( &am
classA{
public:
int sharedResourceA;
pthread_mutex_t mutex1;
functionA();
int nonSharedResources;
}
classA::functionA(){
pthread_mutex_lock( &mutex1 );
use sharedResourceA;
pthread_mutex_unlock( &mutex1 );
}
classA objA;
pthread_mutex_lock(&objA.mutex1) //use lock because another thread can call obj.functionA
use objA.sharedResources;
pthread_mutex_unlock(&objA.mutex1)
use objA.nonSharedResources = blah //without lock because is non shared
或者我不应该在classA中创建锁,而是在应用程序中创建锁。例如:
classA objA;
pthread_mutex_t mutex2;
pthread_mutex_lock(mutex2) //use lock because another thread can call obj.functionA
use objA.sharedResources;
pthread_mutex_unlock(mutex2)
pthread_mutex_lock(mutex2) //use lock because another thread can call obj.functionA
functionA();
pthread_mutex_unlock(mutex2)
use objA.nonSharedResources = blah //without lock because is non shared
我认为第一个更好,因为如果您需要多次实例化ClassA,那么您需要为第二个解决方案创建尽可能多的全局锁
如果您在类内部进行对象封装,并且在方法后面隐藏受保护资源的使用,那么它也尊重对象封装。此外,如果共享资源变得不共享,那么如果使用全局锁,您可以在代码中更改类方法,而不是重构资源的每次使用。我认为第一个更好,因为如果您需要多次实例化ClassA,您需要为第二个解决方案创建尽可能多的全局锁
如果您在类内部进行对象封装,并且在方法后面隐藏受保护资源的使用,那么它也尊重对象封装。此外,如果共享资源变得不共享,那么如果使用全局锁,您可以在代码中更改类方法,而不是重构资源的每次使用。如果Function使用一些共享资源,它应该确保以正确的方式访问它们,即确保线程安全。这是对你提出的第一个选择的投票 有更有效的方法来使用互斥体:请参阅boost::recursive_mutex和boost::recursive_mutex::scoped_lock。使用此选项,您可以确保即使关键部分中的某些内容抛出,您的互斥锁也将被解锁。例如:
使用名称空间boost代码>
struct C
{
function f ()
{
//non critical section
//...
//critical section
{
//acquire the mutex
recursive_mutex::scoped_lock lock(mutex);
//do whatever you want. Can throw if it needs to:)
}//exiting the scope causes the mutex to be released
//non critical section again
}
private:
recursive\u mutex mutex;
}
如果functionA使用一些共享资源,它应该确保以正确的方式访问它们,即确保线程安全。这是对你提出的第一个选择的投票
有更有效的方法来使用互斥体:请参阅boost::recursive_mutex和boost::recursive_mutex::scoped_lock。使用此选项,您可以确保即使关键部分中的某些内容抛出,您的互斥锁也将被解锁。例如:
使用名称空间boost代码>
struct C
{
function f ()
{
//non critical section
//...
//critical section
{
//acquire the mutex
recursive_mutex::scoped_lock lock(mutex);
//do whatever you want. Can throw if it needs to:)
}//exiting the scope causes the mutex to be released
//non critical section again
}
private:
recursive\u mutex mutex;
<代码>
第一,C++中的锁的习惯用法是创建一个使用RAII.< /P>的锁类。
那你可以走了
Lock l(mutex1);
// do stuff under mutex1 lock;
// Lock is freed at end of scope
(我打赌boost有锁,我们自己做的)
第二。(范围问题)。如果类A在内部使用共享资源,那么它应该在内部锁定它们。否则
打电话的人怎么知道该怎么做
你怎么能确定是他们干的
如果您更改了实现呢
应用程序级锁应该在调用方使用共享资源时使用,使用的是类,函数和文件W。注意,在这种情况下,类仍然有自己的内部锁。 第一,在C++中做锁的惯用方式是创建一个使用RAII.< /P>的锁类。
那你可以走了
Lock l(mutex1);
// do stuff under mutex1 lock;
// Lock is freed at end of scope
(我打赌boost有锁,我们自己做的)
第二。(范围问题)。如果类A在内部使用共享资源,那么它应该在内部锁定它们。否则
打电话的人怎么知道该怎么做
你怎么能确定是他们干的
如果您更改了实现呢
当调用者是使用共享资源的调用者,并且正在使用classA、funcX和file W编写更大的文件时,应使用应用程序级锁。请注意,在这种情况下,classA可能仍然有自己的内部锁,您确实需要确保,在获得互斥锁并执行使用共享资源的代码时,该代码决不能引发异常,否则将不会调用相应的互斥解锁。您可以通过使用RAII创建一个简单的类来解决这个问题,该类在构造函数中接受指向互斥体的指针并锁定它,然后在析构函数中解锁互斥体。这样,一旦类对象超出作用域,解锁就会自动完成。看起来不错,您确实需要确保在获得互斥锁并执行使用共享资源的代码时,此代码决不能引发异常,否则不会调用相应的互斥锁解锁。您可以通过使用RAII创建一个简单的类来解决这个问题,该类在构造函数中接受指向互斥体的指针并锁定它,然后在析构函数中解锁互斥体。这样,一旦类对象超出范围,解锁就会自动完成。