簡體   English   中英

並發環境中的C ++ 11 std :: vector

[英]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.

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