2012-02-14 87 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>