簡體   English   中英

在線程上的2D向量上push_back是否安全?

[英]It is safe to push_back on a 2D vector on threads?

可以說我有一個2D數組和這個函數:

void addVec(std::vector<std::vector<short> >& arr, size_t idx){ 
   arr[idx].push_back(idx);
}

std::vector<std::vector<short> > arr(2);
boost::threads th1(addVec, boost::ref(arr), 0);
boost::threads th2(addVec, booost::ref(arr), 1);
th1.join();
th2.join();

現在,我應該有arr [0] [0] = 0; 並且arr [1] [0] = 1; 問題是這是否安全? 在內部,線程應將值添加到向量存儲器的不同部分,並且由於它是在大小2的開頭構造的,因此僅內部向量會被調整大小,因此線程具有獨占訪問權限。

這應該是安全的,因為每個線程都訪問一個單獨的向量。 但是,如果您做任何可能導致arr調整大小的操作,那么所有投注都將關閉...

我建議您退后一步,考慮自己的目標,然后再繼續前進。

首先,為什么要並行化代碼? 我假設您希望程序運行得更快。 那意味着

  1. 您應該首先編寫一個有效的順序實現。
  2. 您應該分析並調整該實現。
  3. 如果(且僅當)您的程序仍然太慢而無法滿足您的目的,則在以下情況下應並行化它:
    1. 程序的大部分可以並行化(請查看阿姆達爾定律 )。
    2. 您的順序實現充分利用了緩存 即使對於順序代碼,高速緩存也很可能成為瓶頸,因此,如果您的代碼不是高速緩存的,則在並行化它時可能會變慢。

要點1.和2.可能是您應該花費時間的地方。 賠率是一個高度優化的順序執行是綽綽有余您的需求,這將是便宜/容易/更快的開發和維護。

如果您決定並行化代碼,則應該看一下OpenMP 線程可能是編寫人類已知的並行程序的最糟糕的方法之一。 您可能認為OpenMP的運行時系統對您來說太慢了,但是再次,您應該退后一步,想一想為什么。

如果您的算法需要大量的鎖和障礙,則可以通過使用更快的鎖和障礙來獲得較小的加速。 如果您改進算法以使用更少的鎖和障礙,則可以實現更大的加速。

這是安全的,盡管從設計的角度來看,只給每個線程提供其內部矢量會更安全,所以將來發生不安全行為的可能性較小

是的,在您的用例中是安全的,因為您無需修改​​共享數據。 但是,我希望將對std::vector<short>的引用傳遞給每個線程以簡化用法:

void addVec(std::vector<short> & arr)
{ 
   arr.push_back(some_data);
}

std::vector<std::vector<short> > arr(2);
boost::threads th1(addVec, boost::ref(arr[0]));
boost::threads th2(addVec, booost::ref(arr[1]));
th1.join();
th2.join();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM