2009-09-24 52 views
0

我正在使用一個封裝了thread_group的類,並對它有一些疑問封裝的boost thread_group。有關ID和同步的問題

class MyGroup{ 

private: 
    boost::this_thread::id _id; 
    boost::thread::thread_group group; 
    int abc; 
    //other attributes 
public: 

    void foo(); 


}; 

在類構造函數中,我啓動N個線程

for (size_t i=0;i<N;i++){ 
     group.add(new boost::thread(boost::bind(&foo,this))); 
} 


void foo(){ 

    _id = boost::this_thread::get_id(); 
    //more code. 
    abc++ //needs to be sync? 
} 

所以,這是我的問題。

類屬性是否需要同步?

每個線程都有不同的ID嗎?例如,如果我有

void bar(){ 
    this->id_; 
} 

這將導致每個線程的不同ID,或者每個人都相同?

提前致謝!

回答

1

是的,即使您使用線程創建助手作爲提升,也必須保護共享數據訪問。

最後,他們都將同時執行相同的代碼,並且庫沒有任何工具可以對您擁有和管理的變量進行保護。

如果這 - > _ id打印當前線程ID然後是,它會打印不同的值,而不同的線程訪問它。

+0

如果bar()是從foo()以外的函數中調用的(即,在單個線程中運行的函數),它仍然會打印不同的值,或者它會打印調用bar()的線程的id? – Tom 2009-09-25 01:50:00

+0

如果該函數是從鏈中的foo()調用的任何函數調用的,它將從不同的線程有效執行,並且具有不同的_ids。 – 2009-09-25 06:43:17

0

我不知道你在用這個thread_group做什麼,所以這可能適用或不適用。

是的,所有的線程都有唯一的ID。

是的,你需要保護你的共享狀態,你可以通過同步或者通過複製它或者通過消息傳遞來「避免」共享狀態來實現。

這裏的一個相關模式是'actor'模式。

本質,而不僅僅是創建線程在構造函數,考慮兩種:

一)具有從boost ::線程和存儲線程特定成員有派生的類。您可以訪問線程中的成員變量,該變量對於該組來說不是全局的。

例如

class MyThreadClass : public boost::thread 
{ 
    private: 
    int thread_local_int; 
    ... 
} 

B)有一個包含升壓類::線程作爲一個成員變量

class MyThreadClass : public boost::thread 
{ 
    private: 
     int thread_local_int; 
     boost::thread t; 
    public: 
     boost::thread& GetThread() 
     { 
      return t; 
     } 
    ... 
} 

店的任一集合中的MyGroup的類,並使用thread_group :: add_thread放thread_group中的線程。

您現在可以約其狀態在thread_group共享難以置信的周到(它應該是同步或只讀)和狀態是本地的演員(或線程),以及如何它的訪問​​。

請注意,我個人不喜歡使用TLS,因爲我喜歡在對象和線程的生命週期中進行一些控制和保證,並且我在不使用它的時候會更輕鬆地找到它; YMMV及其偉大的一些用途...