我有一个包含许多实例的C ++类,我想让我的应用程序线程安全。 该类有一个成员和一个处理它的函数,例如:
class MyCls {
int x;
void f() { x++; }
};
我需要保护这个成员,所以据我所知,我有两个选择:
这两种解决方案都是一个巨大的过度杀伤力:
我可以使用其他解决方案或多线程设计模式吗?
答案 0 :(得分:2)
不确定,但我认为可以使用Software transactional memory机制解决问题。有一堆implementations for C++。
答案 1 :(得分:1)
至于您的第一个问题,每个实例都应该有一个成员互斥,为每个实例提供一个单独的关键部分。
至于第二个,我确信大多数pthread实现都使用futex实现它们的互斥锁。这意味着当没有争用时它们非常快,并且只有在存在争用时才需要操作系统干预。
答案 2 :(得分:0)
如果您不想使用锁或关键部分,那么最简单的解决方案就是不要将状态保留在对象本身中。如果你改变你的类,如下所示,它将是线程安全的:
// Class has no state, only operations on data. So it
// is thread-safe by nature.
class MyCls
{
int foo(int x = 0)
{
return ++x;
}
};
// Usage
MyCls obj;
int x = obj.foo(); // x = 1
x = obj.foo(x); // x = 2
答案 3 :(得分:0)
如果你真的只需要增加那个成员(或类似的简单算术),你只需要原子操作。
不幸的是,这些似乎没有标准化的接口,但即将推出的C标准(C1x)将拥有它们。