2014-01-28 123 views
1

我有一個對象,它是`shared_ptr`與`OMP平行深層副本firstprivate`

  1. 多態性,因此需要由指針被傳遞(或變體,但似乎像矯枉過正
  2. 足夠大,並通過周圍經常不夠,它需要被有效地傳遞(即不復制不必要的)
  3. 不是線程安全的,所以需要當我們進入一個omp parallel部分被複製爲每個線程

有沒有一種方法可以自動爲這個對象聲明適當的複製語義?我的想法是

  1. 創建包含一個指向對象,但不深拷貝我自己的包裝類(有一個行爲像這已經是一個智能指針類?
  2. 總是按引用傳遞包裝所以得到函數調用拷貝(我怎麼查我沒有不小心按值傳遞的地方?
  3. 宣佈作爲firstprivateomp parallel部分,因此它確實獲取複製每個線程

這是明智的嗎?有沒有更好的辦法?

編輯:複製構造函數如何檢查omp_get_thread_num()是否已更改並根據需要執行指針或深度複製?

回答

2

我會用一個shared_ptr來管理對象,並實現一個函數:

shared_ptr<T> deepCopy(const shared_ptr<T>& obj); 

,關於請求進行深層副本並返回另一個共享指針。然後可以在並行區域內使用此功能,以在需要時實例化obj的私人副本。

+0

有一個upvote提醒我我做這太複雜了:)我最終選擇了一個不同的選項。 'scoped_ptr'來處理非拷貝多態語義。在這個包裝中添加線程安全性的對象(將張貼在另一個問題)。因此保持線程細節並將其從頂層算法中拷貝出來。 –

+0

另一個更新,一年後重新訪問代碼。上面提到的'deepCopy'的問題是(我認爲)它將在並行的每次迭代中調用一次,因爲每個線程只需要一次。所以,事情是把這個類包裝在另一個具有深層複製語義的類中,以將它傳遞到並行區域,然後將其解包到該區域中以進行淺拷貝。 –