[英]C++11 std::vector in concurrent environment
我有一個問題(segfault)在C ++ 11中運行多線程代碼。 這是代碼:
#include <vector>
#include <thread>
std::vector<int> values;
int i;
void values_push_back()
{
values.push_back(i);
}
int main()
{
while(true)
{
std::vector<std::thread> threads;
for(i=0; i<10; ++i)
{
std::thread t(values_push_back);
threads.push_back(std::move(t));
}
for(i=0; i<10; ++i)
threads[i].join();
}
return 0;
}
這里是gdb上的回溯: http : //pastebin.com/5b5TN70c
這有什么不對?
這與移動無關。
多個線程在同一個vector
上執行vector::push_back()
但是vector::push_back()
不是線程安全的。 對vector
的修改需要同步。
可以使用std::mutex
來同步對push_back()
的調用:
std::vector<int> values;
std::mutex values_mutex;
void values_push_back()
{
values_mutex.lock();
values.push_back(i);
values_mutex.unlock();
}
此外,變量i
在線程之間共享而沒有同步,這將導致競爭條件(這可能導致重復的int
添加到vector
)。 考慮將int
值作為參數傳遞給線程以避免這種情況:
std::vector<int> values;
std::mutex values_mutex;
void values_push_back(int i)
{
values_mutex.lock();
values.push_back(i);
values_mutex.unlock();
}
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::thread(values_push_back, i));
}
for (auto& t: threads) t.join();
正如bamboon所評論的那樣,更喜歡std::lock_guard
以確保在push_back()
拋出時釋放鎖定(在這種情況下只能是bad_alloc()
但如果vector
更改為包含具有拋出構造函數的更復雜對象,則變得更加重要) :
void values_push_back(int i)
{
std::lock_guard<std::mutex> lk(values_mutex);
values.push_back(i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.