假设我有一个代表某个数据结构的类,名为 foo:
现在假设在软件构建的后期,我发现需要使用多线程。我应该在foo中添加互斥锁吗?
假设编译器优化已经处理了虚拟调度。我想知道是否应该使用继承还是将互斥锁放在原始类中。我已经在Stackoverflow上搜索过了,但我觉得我的问题有些太具体了。注意,这里不必只有一个参数,问题是抽象的,具有n个参数的类。
class foo{
public:
foo(){
attr01 = 0;
}
void f(){
attr01 += 5;
}
private:
int attr01;
};
class fooSingleThreadUserClass{
void usefoo(){
fooAttr.f();
}
foo fooAttr;
}
现在假设在软件构建的后期,我发现需要使用多线程。我应该在foo中添加互斥锁吗?
class foo{
public:
foo(){
attr01 = 0;
}
void f(){
attr01Mutex.lock();
attr01 += 5;
attr01Mutex.unlock();
}
private:
int attr01;
std::mutex attr01Mutex;
};
class fooMultiThreadUserClass{
void usefoo(){
std::thread t1(&fooMultiThreadUserClass::useFooWorker, this);
std::thread t2(&fooMultiThreadUserClass::useFooWorker, this);
std::thread t3(&fooMultiThreadUserClass::useFooWorker, this);
std::thread t4(&fooMultiThreadUserClass::useFooWorker, this);
t1.join();
t2.join();
t3.join();
t4.join();
}
void useFooWorker(){
fooAttr.f();
}
foo fooAttr;
}
我知道现在fooMultiThreadUserClass能够高效地运行foo而不会发生竞争,但是fooSingleThreadUserClass是否会因为互斥锁的开销而失去性能呢?我非常想知道。还是应该从foo派生fooCC以用于并发目的,这样fooSingleThreadUserClass就可以继续使用没有互斥锁的foo,而fooMultiThreadUserClass使用带有互斥锁的fooCC,如下所示:
class fooCC : public foo{
public:
foo(){
attr01 = 0;
}
void f(){ // I assume that foo::f() is now a virtual function.
attr01Mutex.lock();
foo::f();
attr01Mutex.unlock();
}
private:
std::mutex attr01Mutex;
};
假设编译器优化已经处理了虚拟调度。我想知道是否应该使用继承还是将互斥锁放在原始类中。我已经在Stackoverflow上搜索过了,但我觉得我的问题有些太具体了。注意,这里不必只有一个参数,问题是抽象的,具有n个参数的类。
int
,您可以使用std::atomic_int
。 - chrisstd::lock_guard
来确保它们保持同步。有时候你需要同步多个对象,在这种情况下,把同步实现在对象外部会变得更加复杂(至少在我的实践中,同步一组对象比较困难,除非它们本身是另一个对象的一部分,而该对象又可以按照每个公共函数进行同步)。 - Alexis Wilke