ããã°ã©ãã³ã°è¨èªC++ã®ãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãª(TM; Transactional Memory)æ¡å¼µã«é¢ãããã©ããä»æ§v1.1ï¼âid:yohhoy:20120414ï¼ããã®å·®åã¡ã¢ã
æ¬è¨äºã®å 容ã¯ã2013å¹´8æä»ãã®(PDF)N3718 Transactional Memory Support for C++ã«åºã¥ãã
2020-05-22追è¨ï¼2015å¹´9æã« ISO/IEC TS 19841:2015*1ãæ£å¼çºè¡ãããããã¦ã¼ã¶çµé¨ã®å°ãªãããC++17ä»æ§ã¸ã®çµ±åã¯è¦éããã*2ã2019å¹´ã«ã¯å¦çç³»ã®å®è£ è² æ ãå°ãªãã軽éãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãª(TM Lite)ããææ¡ãã*3ã2020å¹´5æç¾å¨ãP2066ã§è°è«ãç¶ãã¦ããã
2024-06-20追è¨ï¼TM Liteææ¡ã«åºã¥ã*42022å¹´10æC++TMæ¡å¼µv2ãã©ãã (PDF)N4923 ãæå¾ã«åãããªããC++ãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãªæ¡å¼µã¯äºå®ä¸æ¾æ£ãããå¯è½æ§ãã(ï½¥Ïï½¥` )
æ°ãã¼ã¯ã¼ãã¨å±æ§
ãã©ã³ã¶ã¯ã·ã§ã³ã表ããã¼ã¯ã¼ã群ãããå
é ã¢ã³ãã¼ã¹ã³ã¢2ã¤(__
)ãåãé¤ããããããã«ãã£ã³ã»ã«æ§æ__transaction_cancel
ã¯åé¤ããããã©ã³ã¶ã¯ã·ã§ã³ãã£ã³ã»ã«ã¯atomicãã©ã³ã¶ã¯ã·ã§ã³æ§æã¨å¼·çµåãããï¼è©³ç´°å¾è¿°ï¼ã
ã¾ããå±æ§outer
, transaction_callable
, transaction_safe
, transaction_unsafe
, transaction_may_cancel_outer
ã¯å
¨ã¦åé¤ãããæ°ãããã¼ã¯ã¼ãããã³ã³ã³ããã¹ãä¾åãã¼ã¯ã¼ã(contextual keyword)ã追å ãããã
v1.1 | N3718 |
---|---|
__transaction_relaxed |
transaction_relaxed |
__transaction_atomic |
transaction_atomic |
__transaction_cancel |
ï¼åé¤ï¼ |
ï¼æ°è¨ï¼ | transaction_safe |
ï¼æ°è¨ï¼ | transaction_unsafe |
ï¼æ°è¨ï¼ | commit_on_escape â |
ï¼æ°è¨ï¼ | cancel_on_escape â |
â ï¼atomicãã©ã³ã¶ã¯ã·ã§ã³æ§æã§ã®ã¿æå¹ãªã³ã³ããã¹ãä¾åãã¼ã¯ã¼ã
ãã©ã³ã¶ã¯ã·ã§ã³ã®ãã£ã³ã»ã«
v1.1ã«ãããatomicãã©ã³ã¶ã¯ã·ã§ã³ã®ãã£ã³ã»ã«æ§æã¯ãN3718ã§ã¯atomicãã©ã³ã¶ã¯ã·ã§ã³ä¸ããã®ä¾å¤éåºæã®æ¯ãèãã¨ãã¦ä¸è¬åããããã©ã³ã¶ã¯ã·ã§ã³ã®ãã£ã³ã»ã«ï¼ããã©ã³ã¶ã¯ã·ã§ã³ããã®ä¾å¤éåºãã«ãã表ç¾ãããã¾ãåatomicãã©ã³ã¶ã¯ã·ã§ã³æ§æã«ã¦ä¾å¤éåºæã®åä½ãæå®ãããããouter
å±æ§ãç¨ããæå¤ãã©ã³ã¶ã¯ã·ã§ã³è¡¨æã¯ä¸è¦ã¨ãªã£ãã
ãªããrelaxedãã©ã³ã¶ã¯ã·ã§ã³ã¯v1.1åæ§ã«ãã£ã³ã»ã«ä¸å¯ã§ããã
atomicãã©ã³ã¶ã¯ã·ã§ã³ã¨C++ä¾å¤
transaction_atomic
æã«ã¯ãã©ã³ã¶ã¯ã·ã§ã³ä¾å¤æå®ånoexcept
ï¼commit_on_escape
ï¼cancel_on_escape
ããããã®æå®ãå¿
é ã¨ãªã£ãã*5
transaction_atomic noexcept { ... }
transaction_atomic commit_on_escape { ... }
transaction_atomic cancel_on_escape { ... }
- noexcept
- 該å½ãã©ã³ã¶ã¯ã·ã§ã³ããã¯æ±ºãã¦ä¾å¤éåºãè¡ããªããä¾å¤éåºæã¯
std::abort
ã«ããããã°ã©ã åæ¢ã*6ããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã£ã³ã»ã«ãããã - commit_on_escape
- ä¾å¤éåºã«ãããã©ã³ã¶ã¯ã·ã§ã³ãæããå ´åãããã¾ã§ã«è¡ããã該å½ãã©ã³ã¶ã¯ã·ã§ã³å å¦çã¯ã³ããããããã
- cancel_on_escape
- âtransaction-safeâ ãªä¾å¤éåºã«ãããã©ã³ã¶ã¯ã·ã§ã³ãæããå ´åã該å½ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã£ã³ã»ã«ãããããã ããéåºãããä¾å¤ã âtransaction-safeâ ã§ãªãå ´åã¯
std::abort
ã«ããããã°ã©ã åæ¢ããã
âtransaction-safeâãªä¾å¤ã¯ãv1.1ããã®æ´æ°åï¼åæåã«å ããC++æ¨æºã©ã¤ãã©ãªå®ç¾©ã®ä¾å¤åï¼std::exception
æ´¾çã¯ã©ã¹ï¼ã®ã¿ã許容ãããã
é¢æ°ã¨âtransaction-safeâ
é¢æ°ã«å¯¾ãã âtransaction-safeâ æ§ã¯ãã®é¢æ°åã®ä¸é¨ã¨æ±ãããtransaction_safe
ï¼transaction_unsafe
ãã¼ã¯ã¼ãã«ãã表æãã*7ãããããæè¨ããªãå ´åãé¢æ°å®£è¨ã§ã¯æé»ã« âtransaction-safeâ ã¨ä»®å®ããã¦ãé¢æ°å¼ã³åºããã¾ãã âtransaction-safeâ æ§ã®æ´åãã§ãã¯ã¯ãªã³ã¯æã«è¡ããã*8ã
// é¢æ°å®£è¨ã®ã¿ void f1() transaction_safe; void f2() transaction_unsafe; void f0(); // transaction_safe transaction_atomic cancel_on_escape { f1(); // OK f2(); // NG: ã³ã³ãã¤ã«ã¨ã©ã¼ f0(); // ãªã³ã¯æã«æ´åãã§ã㯠}
ãªããåä¸ã·ã°ããã£ãã¤ç°ãªã âtransaction-safeâ æ§ããã¤é¢æ°ãªã¼ãã¼ãã¼ãã¯ç¦æ¢ãããã
int func() transaction_safe; int func() transaction_unsafe; // NG
ä¸è¨æ¡ä»¶ã®ãããããæºããã¨ãããã®é¢æ°ã âtransaction-unsafeâ ã¨ãªããã¤ã¾ãããã以å¤ã®é¢æ°ã§ã¯ âtransaction-safeâ ã§ããã¨æ¨è«ãããã
- é¢æ°å®£è¨ã§
transaction_unsafe
ãã¼ã¯ã¼ããæå®ãããã transaction_safe
æå®ãããä»®æ³é¢æ°ã§ã¯ãªãããã¤ãªã¼ãã¼ã©ã¤ã対象ã¨ãªãåºåºã¯ã©ã¹ã§ãtransaction_safe
æå®ãããã¦ããªããï¼ä»®æ³é¢æ°ã¯æ¢å®ã§ âtransaction-unsafeâ ã¨æ¨è«ããããï¼- é¢æ°ãã©ã¡ã¼ã¿ã®ããããã§volatile修飾ããã¦ããã
- volatileã¡ã³ãå¤æ°ãå«ãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ï¼ãã¹ãã©ã¯ã¿ã§ããã
- é¢æ°æ¬ä½ã« âtransaction-unsafeâ ãªå¦çãå«ãã
C++æ¨æºã©ã¤ãã©ãªã¨âtransaction-safeâ
N3718æç¹ã§ã¯ä»¥ä¸ã®é¢æ°ï¼ä¾å¤ã¯ã©ã¹ã®ã¿ã âtransaction-safeâ ã¨å®ç¾©ãã¤ã¾ãatomicãã©ã³ã¶ã¯ã·ã§ã³ä¸ã§å©ç¨å¯è½ãªé¢æ°ï¼ä¾å¤ã¯ã©ã¹ã¨ãªãã
- <cstdlib>ããã
- abort
- <new>ããã
- ã©ã¤ãã©ãªæä¾ã®ã°ãã¼ãã«ã¡ã¢ãªç¢ºä¿/解æ¾é¢æ°ï¼operator new/deleteçï¼
- bad_alloc, bad_array_length, bad_array_new_length
- <typeinfo>ããã
- bad_cast, bad_typeid
- <exception>ããã
- bad_exception
- <stdexcept>ããã
- å ¨ä¾å¤ã¯ã©ã¹ï¼logic_error, domain_error, invalid_argument, length_error, out_of_range, runtime_error, range_error, overflow_error, underflow_error
- <cstdlib>ããã
- calloc, malloc, free, realloc
- <cstring>ããã
- memchr, memcmp, memcpy, memmove, memset
- <cmath>ããã
- abs, ldiv, rand, div, llabs, srand, labs, lldiv
ãã®ä»
- v1.1ã«ãã£ããé¢æ°æ¬ä½ã«å¯¾ãããã©ã³ã¶ã¯ã·ã§ã³æå®ãããå¼ã«å¯¾ãããã©ã³ã¶ã¯ã·ã§ã³æå®ãã¯åé¤ãããã
- ã空ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåææ©æ§ã¨ãã¦æ©è½ãããï¼ãã¨ããè°è«ããªããã¦ããããN3718æç¹ã§ã¯æªæ±ºçã
é¢é£URL
*1:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
*2:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0265r0.pdf
*3:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1875r0.pdf
*4:https://github.com/cplusplus/papers/issues/793
*5:v1.1ã§ã¯ noexcept ã®ã¿ãä»»æã§æå®ã§ããã¾ãä¾å¤éåºæã®æ¢å®åä½ã¯ commit_on_escape ç¸å½ã§ãã£ãã
*6:v1.1ã§ã¯ä¾å¤éåºæã« std::terminate ãå¼ã³åºããã¦ããããN3718ã§ã¯ std::abort ã«å¤æ´ããã¦ãããããããä¾å¤éåºï¼ãã£ã³ã»ã«ãæ確ã«ããããã
*7:v1.1ã§ã¯ååã®å±æ§(attribute)ãå©ç¨ãã¦ããããåã·ã¹ãã ã®ä¸é¨ã§ãããã¨ãæ確ã«ãããããã¼ã¯ã¼ãã«æ ¼ä¸ãããã¨èããããã
*8:N3718 Wordingæ¡ã§ã¯é¢æ°ã«å¯¾ãã "transaction-safe linkage" ãå®ç¾©ãããã®linkageæç¡ã«ããæ´åãã§ãã¯ã¨ãã¦è¡¨ç¾ãã¦ããã