2014-01-27 36 views
0

我有一個線程,它爲每個生成的作業提供一些本地數據。我想檢查我是否可以通過「局部變量」的參照作業(仿)在多線程環境中將局部變量作爲常量引用傳遞

例如傳球,

ThreadPool tp; 

void func(){ 

Employee emp; 
tp.enqueueJob(bind(&foo,emp)); 

} 


void foo(const Employee &emp){ 
//Access emp when the job is executed. 
} 

所以,問題是,按照標準將我保證當控制超出func後,從foo執行作業時有權訪問Employee

我知道它是不安全的假設,我們可以訪問本地變量,一旦我們走出塊,但只是想檢查,因爲一些編譯器都允許返回一個局部變量爲const引用。

回答

2
bind(&foo,emp) 

這需要emp的副本,並將該函數作爲參數進行調用。

如果這就是你想要的,那麼一切都很好。如果你想要的功能作用於emp本身,那麼你需要:

  • 結合參考,bind(&foo, std::ref(emp))
  • 確保目標持續到功能與它完成
  • 要小心同步線程
+0

得到它之間的訪問。快速的問題,所以你的意思是綁定需要emp作爲值並傳遞給foo作爲const引用? (並使用std :: ref來確保綁定也需要ref?) – theAlias

+0

@theAlias:是的。 'bind'產生一個包含其參數拷貝的對象,它用作函數的參數; 'ref'給出了一個「引用包裝器」類型,它就像是對其參數的引用。 –