簡體   English   中英

帶有std :: promise的C ++ 11分段錯誤

[英]C++11 Segmentation fault with std::promise

C ++ std :: promise分段錯誤

這段代碼創建了多個線程,並向它們發送一個promise& 當它們調用promise::set_value嘗試將數據返回到main時,它將出現段錯誤。

誰能解釋為什么此代碼會產生分段錯誤?

void workerFunc(promise<long>& prom) {

    long number = doInterestingThings();
    //SEGFAULT!!!
    prom.set_value(number);
    return;
}

線程功能。 它在prom.set_value處出現段prom.set_value 如果僅創建1個線程,則不執行此操作。

int main (int argc, char** argv) {
    vector<promise<long>> promises;
    vector<future<long>> futures;
    vector<thread> workers;

Intialization。

    const int createThisMany = 6;
    for (int i = 0; i < createThisMany; i++) {
        promises.emplace_back();
        futures.push_back(promises.back().get_future());
        workers.emplace_back(workerFunc, std::ref(promises.back()));
    }

創建所有線程, promisefuture對象。 不包括監視向量和刪除死線程等的主循環。

承諾和期貨是否必須同步?

我在Lubuntu 14.04上使用gcc 4.9

你不能分享諾言。 改為移動它們:

 workers.emplace_back(workerFunc, std::move(promises.back());

和:

void workerFunc(promise<long> prom);

這意味着您可能也不需要空的承諾向量:

promise<long> pr;
futures.push_back(pr.get_future());
workers.emplace_back(workerFunc, std::move(pr));

promises.emplace_back(); 可能導致向量重新分配,並使所有包含的對象位置(引用,迭代器)無效。 您有懸掛的參考文獻。

將promise放入存儲將發送給數據使用者的future后,將完成promise的代碼中。

請注意,MSVC在2013年搞砸了promise的部分線程移動。

暫無
暫無

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

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