2012-02-14 70 views
1

我是多线程编程的新手,如果这看起来太简单,请不要笑。Boost,互斥体,类成员,共享对象成员

我有一个简单的类对象,它有几个成员变量,例如,

class XYZ 
{ 
public: 
int a; 
int b; 
... 
}; 

XYZ是多个线程之间共享的对象,什么是共享“”多线程之间的最佳方式是什么?例如,

在线程A,我会做这样的事情

xyz.a = xyz.a + rand(); 

在线程B,我会做这样的事情

xyz.a = xyz.a - rand(); 

我听说过创建一个互斥体类成员,有人可以请举一个简单的例子如何做到这一点。

如何创建一个允许多个线程安全访问其成员的类接口?

+0

我想,我可以改写这个问题:“我怎样才能创建一个类的接口,它允许多个线程安全地访问其成员吗?” – 2607 2012-02-14 19:14:49

回答

1

您可以使用一个互斥。它们只能被一个线程同时锁定。

class XYZ 
{ 
    int a,b; 
    boost::mutex mutex; 
} 

然后使用线程代码

void thread(XYZ *xyz) 
{ 
    //.... 

    // now a member of xyz should be accessed/changed. 
    { 
    boost::unique_lock<boost::mutex> lock(xyz->mutex); // lock first the mutex 
    // do something with members of xyz 
    // ... 
    } // mutex automatically freed because lock object destroyed 

    //... 
} 
+0

johfel,谢谢你的回复。它会自动锁定a和b吗?我如何实现以下, threadA,只锁定一个。 threadB,只锁b。 谢谢。 – 2607 2012-02-14 19:31:30

+0

只需使用两个互斥对象即可。互斥体并不直接锁定自己的东西。因为它可以同时被一个线程锁定,所以它可以用来控制对任何你想要的东西的访问。 – jofel 2012-02-14 19:41:08

1

如果您使用指针,您可以使用boost::shared_ptr<O>(其中O是指针的对象类)。

对于那些整型,你可以使用:boost:atomic<int>