68
68
69
69
</ head >
70
70
< body >
71
- < header data-kunai-mdinfo ="{"meta": {"header": ["future"], "namespace": ["std"], "class": ["future"], "id-type": ["function template"], "cpp": ["cpp11"]}, "sources": [{"id": "ca76fe51671a15677ad5a83f5d34211cc477aa73", "source": "#include <iostream>\n#include <future>\n#include <thread>\n#include <utility>\n\nvoid calc(std::promise<int> p)\n{\n p.set_value(3); // \u7d50\u679c\u3092\u66f8\u304d\u8fbc\u3080\n}\n\nint main()\n{\n std::promise<int> p;\n std::future<int> f = p.get_future();\n\n std::thread t(calc, std::move(p));\n\n // \u7d50\u679c\u304c\u66f8\u304d\u8fbc\u307e\u308c\u308b\u307e\u3067\u5f85\u6a5f\u3059\u308b\n // 3\u79d2\u3067\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\n std::future_status result = f.wait_for(std::chrono::seconds(3));\n if (result != std::future_status::timeout) {\n // \u7d50\u679c\u3092\u53d6\u308a\u51fa\u3059(\u6e96\u5099\u5b8c\u4e86\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u3059\u3050\u306b\u5024\u3092\u53d6\u308a\u51fa\u305b\u308b)\n std::cout << f.get() << std::endl;\n }\n else {\n std::cout << \"timeout\" << std::endl;\n }\n\n t.join();\n}\n"}, {"id": "477e26dab1ecdab718bfa27e364f00ef465132cf", "source": "#include <iostream>\n#include <future>\n#include <chrono>\n\nint main()\n{\n std::promise<int> p;\n std::future<int> f = p.get_future();\n const auto ready = [&f] {\n return f.wait_for(std::chrono::seconds{0}) == std::future_status::ready;\n };\n\n // \u307e\u3060\u5024\u306f\u30bb\u30c3\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\n std::cout << std::boolalpha << ready() << std::endl;\n\n p.set_value(1);\n\n // \u5024\u304c\u30bb\u30c3\u30c8\u3055\u308c\u305f\n std::cout << std::boolalpha << ready() << std::endl;\n\n f.get(); // \u4e00\u5ea6\u5024\u3092\u53d6\u308a\u51fa\u3059\u3068\u5171\u6709\u72b6\u614b\u304c\u7834\u68c4\u3055\u308c\u308b\n\n // \u5171\u6709\u72b6\u614b\u3092\u6301\u305f\u306a\u3044(valid() == false\u306a)future\u3067wait\u3092\u3059\u308b\u3068std::future_error\u4f8b\u5916\n // \u305f\u3060\u3057\u3001libc++\u3067\u306f(\u5c11\u306a\u304f\u3068\u308219.1.0\u307e\u3067\u306f)SEGV\u3059\u308b\u306e\u3067\u6ce8\u610f\n try {\n ready();\n }\n catch(const std::future_error& e) {\n std::cout << e.what() << std::endl;\n }\n}\n"}], "page_id": ["reference", "future", "future", "wait_for"]} ">
71
+ < header data-kunai-mdinfo ="{"meta": {"header": ["future"], "namespace": ["std"], "class": ["future"], "id-type": ["function template"], "cpp": ["cpp11"]}, "sources": [{"id": "ca76fe51671a15677ad5a83f5d34211cc477aa73", "source": "#include <iostream>\n#include <future>\n#include <thread>\n#include <utility>\n\nvoid calc(std::promise<int> p)\n{\n p.set_value(3); // \u7d50\u679c\u3092\u66f8\u304d\u8fbc\u3080\n}\n\nint main()\n{\n std::promise<int> p;\n std::future<int> f = p.get_future();\n\n std::thread t(calc, std::move(p));\n\n // \u7d50\u679c\u304c\u66f8\u304d\u8fbc\u307e\u308c\u308b\u307e\u3067\u5f85\u6a5f\u3059\u308b\n // 3\u79d2\u3067\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\n std::future_status result = f.wait_for(std::chrono::seconds(3));\n if (result != std::future_status::timeout) {\n // \u7d50\u679c\u3092\u53d6\u308a\u51fa\u3059(\u6e96\u5099\u5b8c\u4e86\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u3059\u3050\u306b\u5024\u3092\u53d6\u308a\u51fa\u305b\u308b)\n std::cout << f.get() << std::endl;\n }\n else {\n std::cout << \"timeout\" << std::endl;\n }\n\n t.join();\n}\n"}, {"id": "67bfb990a6eaeee537e0c4e1a943037bd4e707ab", "source": "#include <iostream>\n#include <future>\n#include <chrono>\n\nint main()\n{\n std::promise<int> p;\n std::future<int> f = p.get_future();\n const auto ready = [&f] {\n return f.wait_for(std::chrono::seconds{0}) == std::future_status::ready;\n };\n\n // \u307e\u3060\u5024\u306f\u30bb\u30c3\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\n std::cout << std::boolalpha << ready() << std::endl;\n\n p.set_value(1);\n\n // \u5024\u304c\u30bb\u30c3\u30c8\u3055\u308c\u305f\n std::cout << std::boolalpha << ready() << std::endl;\n\n f.get(); // \u4e00\u5ea6\u5024\u3092\u53d6\u308a\u51fa\u3059\u3068\u5171\u6709\u72b6\u614b\u304c\u7834\u68c4\u3055\u308c\u308b\n\n // \u5171\u6709\u72b6\u614b\u3092\u6301\u305f\u306a\u3044(valid() == false\u306a)future\u3067wait\u3092\u3059\u308b\u3068UB\n // ready();\n}\n"}], "page_id": ["reference", "future", "future", "wait_for"]} ">
72
72
< nav class ="navbar navbar-default " role ="navigation ">
73
73
< div class ="container-fluid ">
74
74
< div class ="navbar-header ">
200
200
201
201
< p class ="text-right "> < small >
202
202
最終更新日時(UTC):
203
- < span itemprop ="datePublished " content ="2025-01-04T00:32:32 ">
204
- 2025年01月04日 00時32分32秒
203
+ < span itemprop ="datePublished " content ="2025-01-04T04:22:52 ">
204
+ 2025年01月04日 04時22分52秒
205
205
</ span >
206
206
< br />
207
207
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -243,6 +243,13 @@ <h2><a class="cpprefjp-defined-word" data-desc="問題が発生したときに
243
243
< ul >
244
244
< li > C++14 : 時計クラス、< code > < a href ="../../chrono/time_point.html "> time_point</ a > </ code > クラス、< code > < a href ="../../chrono/duration.html "> duration</ a > </ code > クラスの構築が< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > を送出する場合、この関数はそれらの< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > を送出する。</ li >
245
245
</ ul >
246
+ < h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Preconditions。関数呼び出し時に満たされていると関数が想定する条件。満たさなければ未定義の動作。契約属性の`[[expects]]`に相当 "> 事前条件</ a > </ h2 >
247
+ < ul >
248
+ < li > < code > < a href ="valid.html "> valid()</ a > == true</ code > < ul >
249
+ < li > この条件を満たさなかった場合、処理系によっては< code > < a href ="../future_error.html "> future_error</ a > </ code > < a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > を投げることがある。</ li >
250
+ </ ul >
251
+ </ li >
252
+ </ ul >
246
253
< h2 > 例</ h2 >
247
254
< h3 > 例1</ h3 >
248
255
< p > < div class ="yata " id ="ca76fe51671a15677ad5a83f5d34211cc477aa73 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
@@ -281,7 +288,7 @@ <h4>出力例</h4>
281
288
< p > < pre > < code > 3
282
289
</ code > </ pre > </ p >
283
290
< h3 > 例2</ h3 >
284
- < p > < div class ="yata " id ="477e26dab1ecdab718bfa27e364f00ef465132cf "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
291
+ < p > < div class ="yata " id ="67bfb990a6eaeee537e0c4e1a943037bd4e707ab "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
285
292
< span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../future.html "> <future></ a > </ span > < span class ="cp "> </ span >
286
293
< span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../chrono.html "> <chrono></ a > </ span > < span class ="cp "> </ span >
287
294
@@ -303,21 +310,14 @@ <h3>例2</h3>
303
310
304
311
< span class ="n "> < a href ="../shared_future/get.html "> f.get()</ a > </ span > < span class ="p "> ;</ span > < span class ="c1 "> // 一度値を取り出すと共有状態が破棄される</ span >
305
312
306
- < span class ="c1 "> // 共有状態を持たない(< a href ="valid.html "> valid()</ a > == falseな)futureでwaitをすると< a href ="../future_error.html "> std::future_error</ a > 例外</ span >
307
- < span class ="c1 "> // ただし、libc++では(少なくとも19.1.0までは)SEGVするので注意</ span >
308
- < span class ="k "> try</ span > < span class ="p "> {</ span >
309
- < span class ="n "> ready</ span > < span class ="p "> ();</ span >
310
- < span class ="p "> }</ span >
311
- < span class ="k "> catch</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> < a href ="../future_error.html "> std::future_error</ a > </ span > < span class ="o "> &</ span > < span class ="n "> e</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
312
- < span class ="n "> < a href ="../../iostream/cout.html "> std::cout</ a > </ span > < span class ="o "> <<</ span > < span class ="n "> e</ span > < span class ="p "> .</ span > < span class ="n "> what</ span > < span class ="p "> ()</ span > < span class ="o "> <<</ span > < span class ="n "> < a href ="../../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span >
313
- < span class ="p "> }</ span >
313
+ < span class ="c1 "> // 共有状態を持たない(< a href ="valid.html "> valid()</ a > == falseな)futureでwaitをするとUB</ span >
314
+ < span class ="c1 "> // ready();</ span >
314
315
< span class ="p "> }</ span >
315
316
</ code > </ pre > </ div >
316
317
</ div > </ p >
317
318
< h4 > 出力例</ h4 >
318
319
< p > < pre > < code > false
319
320
true
320
- std::future_error: No associated state
321
321
</ code > </ pre > </ p >
322
322
< h2 > バージョン</ h2 >
323
323
< h3 > 言語</ h3 >
0 commit comments