![](/img/trans.png)
[英]c++ -std=c++11 -stdlib=libc++ with boost.thread gives Segmentation fault: 11 on OSX
[英]C++11 Segmentation fault with 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()));
}
創建所有線程, promise
和future
對象。 不包括監視向量和刪除死線程等的主循環。
承諾和期貨是否必須同步?
我在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.