久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

為什么從`std::async` 阻塞返回未來的析構(gòu)函數(shù)?

Why is the destructor of a future returned from `std::async` blocking?(為什么從`std::async` 阻塞返回未來的析構(gòu)函數(shù)?)
本文介紹了為什么從`std::async` 阻塞返回未來的析構(gòu)函數(shù)?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

當(dāng)試圖回答另一個 Stackoverflow 問題,我意識到這個簡單的 C++11 代碼段隱式地阻塞了調(diào)用線程:

std::async(std::launch::async, run_async_task)

對我來說,這似乎是規(guī)范的 C++11 異步啟動任務(wù)而不關(guān)心結(jié)果的方式.相反,為了實現(xiàn)這一點,必須明顯地創(chuàng)建和分離一個線程(參見 answer 提到的問題).>

所以這是我的問題:std::future 的析構(gòu)函數(shù)是否有任何關(guān)于安全/正確性的原因必須阻塞?如果它只在 get 上阻塞還不夠,否則,如果我對返回值或異常不感興趣,它只是觸發(fā)并忘記?

解決方案

阻止 std::async 和線程返回的期貨的析構(gòu)函數(shù):這是一個有爭議的話題.以下按時間順序排列的論文列表反映了委員會成員的一些討論:

  • N2802:請求重新考慮線程的 detach-on-destruction對象 作者:漢斯·博姆
  • N3630:異步、~future 和~線程(修訂版 1) 作者:赫伯·薩特
  • N3636:~thread 應(yīng)該加入 作者 Herb Sutter
  • N3637:異步和 ~future(修訂版 3) 作者:赫伯·薩特、錢德勒·卡魯斯、尼克拉斯·古斯塔夫森
  • N3679:Async() 未來的析構(gòu)函數(shù)必須等待作者:漢斯·博姆
  • N3773:異步和 ~future(修訂版 4) 作者:赫伯·薩特、錢德勒·卡魯斯、尼克拉斯·古斯塔夫森
  • N3776:未來的措辭 作者 Herb Sutter
  • N3777:棄用異步的措辭 作者 Herb Sutter

盡管有很多討論,但 C++14 沒有計劃改變 std::futurestd::thread.

關(guān)于你的問題,最有趣的論文可能是 Hans Boehm 的第二篇.我引用了一些部分來回答你的問題.

<塊引用>

N3679:Async() 未來的析構(gòu)函數(shù)必須等待

[..] 由 async() 返回的具有 async 啟動策略的 Futures 在它們的析構(gòu)函數(shù)中等待相關(guān)的共享狀態(tài)準(zhǔn)備就緒.這可以防止出現(xiàn)關(guān)聯(lián)線程繼續(xù)運行的情況,并且不再有等待它完成的方法,因為關(guān)聯(lián)的未來已被銷毀.如果沒有英勇的努力以其他方式等待完成,這樣一個失控"的線程可以繼續(xù)運行超過它所依賴的對象的生命周期.

[例子]

最終結(jié)果很可能是跨線程內(nèi)存粉碎".如果 get()wait() 在它們 [期貨] 被銷毀之前被調(diào)用 [..],這個問題當(dāng)然可以避免.困難 [..] 是意外的異??赡軙?dǎo)致該代碼被繞過.因此,通常需要某種范圍保護(hù)裝置來確保安全.如果程序員忘記添加范圍保護(hù),攻擊者可能會生成例如在適當(dāng)?shù)臅r候發(fā)生 bad_alloc 異常以利用疏忽,并導(dǎo)致堆棧被覆蓋.還可以控制用于覆蓋堆棧的數(shù)據(jù),從而獲得對過程的控制.這是一個非常微妙的錯誤,根據(jù)我們的經(jīng)驗,它很可能在實際代碼中被忽略.

更新:Michael Wong 的旅行報告還包含一些關(guān)于 2013 年 9 月會議成果的有趣信息:

<塊引用>

關(guān)于異步析構(gòu)函數(shù)不應(yīng)阻塞的問題,我們對此進(jìn)行了大量討論.[..] 唯一獲得大量支持的立場是 [..] 給出警告,即未來的析構(gòu)函數(shù)不會阻塞,除非從 async 返回,使其成為顯著的例外.[..] 經(jīng)過大量討論,我們嘗試攜帶的唯一部分是 N3776,試圖澄清 ~future~shared_future 不阻塞的立場,除了可能存在異步.有一次嘗試沿 C 的路線發(fā)出棄用. 棄用異步而不替換.這個議案實際上幾乎是提出來的.但是 [..] 它甚至在到達(dá)手術(shù)臺之前就已經(jīng)死亡.

When trying to answer another Stackoverflow question, I realized that this simple C++11 snippet is implicitly blocking the calling thread:

std::async(std::launch::async, run_async_task)

To me this would have seemed the canonical C++11 way to launch a task asynchronously without caring about the result. Instead one has to apparently explicitly create and detach a thread (see answer to mentioned question) in order to achieve this.

So here's my question: Is there any reason in regards to safety/correctness that the destructor of a std::future has to be blocking? Wouldn't it be enough if it blocks on get only and otherwise, if I'm not interested in the return value or exception, it's simply fire and forget?

解決方案

Blocking destructors of futures returned by std::async and of threads: That's a controversial topic. The following list of papers in chronological order reflects some of the discussions by the members of the committee:

  • N2802: A plea to reconsider detach-on-destruction for thread objects by Hans Boehm
  • N3630: async, ~future, and ~thread (Revision 1) by Herb Sutter
  • N3636: ~thread Should Join by Herb Sutter
  • N3637: async and ~future (Revision 3) by Herb Sutter, Chandler Carruth, Niklas Gustafsson
  • N3679: Async() future destructors must wait by Hans Boehm
  • N3773: async and ~future (Revision 4) by Herb Sutter, Chandler Carruth, Niklas Gustafsson
  • N3776: Wording for ~future by Herb Sutter
  • N3777: Wording for deprecating async by Herb Sutter

Although there was a lot of discussion, there are no changes planned for C++14 regarding the blocking behaviour of the destructors of std::future and std::thread.

Regarding your question, the most interesting paper is probably the second by Hans Boehm. I quote some parts to answer your question.

N3679: Async() future destructors must wait

[..] Futures returned by async() with async launch policy wait in their destructor for the associated shared state to become ready. This prevents a situation in which the associated thread continues to run, and there is no longer a means to wait for it to complete because the associated future has been destroyed. Without heroic efforts to otherwise wait for completion, such a "run-away" thread can continue to run past the lifetime of the objects on which it depends.

[Example]

The end result is likely to be a cross-thread "memory smash". This problem is of course avoided if get() or wait() is called [..] before they [the futures] are destroyed. The difficulty [..] is that an unexpected exception may cause that code to be bypassed. Thus some sort of scope guard is usually needed to ensure safety. If the programmer forgets to add the scope guard, it appears likely that an attacker could generate e.g. a bad_alloc exception at an opportune point to take advantage of the oversight, and cause a stack to be overwritten. It may be possible to also control the data used to overwrite the stack, and thus gain control over the process. This is a sufficiently subtle error that, in our experience, it is likely to be overlooked in real code.

Update: Michael Wong's Trip Report also contains some interesting information regarding the outcomes of the meeting in September 2013:

The View from the C++ Standard meeting September 2013 Part 2 of 2.

On the issue that async destructors should not block we devoted a great deal of discussion on it. [..] The only position that received considerable support was [..] giving advisory that future destructors will not block, unless returned from async, making it the notable exception. [..] After significant discussion, the only part that we tried to carry was N3776, an attempt to clarify the position that ~future and ~shared_future don’t block except possibly in the presence of async. There was an attempt to issue a deprecation along the lines of C. Deprecate async without replacement. This motion was actually almost put forward. But [..] it died even before it reached the operating table.

這篇關(guān)于為什么從`std::async` 阻塞返回未來的析構(gòu)函數(shù)?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

What is the fastest way to transpose a matrix in C++?(在 C++ 中轉(zhuǎn)置矩陣的最快方法是什么?)
Sorting zipped (locked) containers in C++ using boost or the STL(使用 boost 或 STL 在 C++ 中對壓縮(鎖定)容器進(jìn)行排序)
Rotating a point about another point (2D)(圍繞另一個點旋轉(zhuǎn)一個點 (2D))
Image Processing: Algorithm Improvement for #39;Coca-Cola Can#39; Recognition(圖像處理:Coca-Cola Can 識別的算法改進(jìn))
How do I construct an ISO 8601 datetime in C++?(如何在 C++ 中構(gòu)建 ISO 8601 日期時間?)
Sort list using STL sort function(使用 STL 排序功能對列表進(jìn)行排序)
主站蜘蛛池模板: 亚洲成a| 日韩亚洲欧美在线 | 午夜免费av | 国产一区二区三区精品视频 | 黄色www| 黄色片视频免费 | 美女扒开腿让人桶爽原神 | 夜间福利视频 | 久久综合国产 | 国产精品99久久久久久久久久久久 | 免费观看毛片 | 国产精品海角社区 | 欧美一级特黄视频 | 日韩视频第一页 | 中文字幕1区 | 成人在线免费看 | 在线不卡一区 | 黄色片视频网站 | 日韩美女一区二区三区 | 丝袜美腿亚洲综合 | 国产精品一区三区 | 天堂免费av| 午夜精品一区二区三区在线视频 | 久久精彩 | 色婷婷导航 | 国产一区二区久久 | 黄色三级视频网站 | 国产网站在线 | 特级西西444www大精品视频 | 特级毛片爽www免费版 | 99午夜| 国产美女在线播放 | 这里只有精品视频在线观看 | 黄色三级av | 超碰人人人人 | 欧美性受xxxx黑人xyx性爽 | 亚洲福利专区 | 一区二区三区黄色 | 九九香蕉视频 | 欧美日韩在线看 | 亚洲高清免费视频 |