ìë
íìžì. íí¬ìœë¥ì
ëë€.
ì€ëì ë©í° íë¡ê·žëë° ì 늬 ëŽì©ì
ëë€. êžŽêž ì£Œì íŽì£Œìžì. ã
ã
;;
ì ê° ë©í° íë¡ê·žëë° ê°ë
ìŽ ë¶ì¡±íŽì ì
묎 ì€ ëíìì ìŽíŽ 못í ì ìŽ ëª ë² ììŽì í ë² ì« ì 늬 íŽë³Žììµëë€.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/020.gif)
* ë©í°ì€ë ë íë¡ê·žëë°
- íë¡ìžì ì ëìŽ ì¬ë¬ ê° ì¥ì°©ë 컎íší° ìì€í
ì ì€ìí êž°ë².
- ìì€í
ì ìë ì¬ë¬ íë¡ìžì ì ëì ë³ë ¬ë¡ ì¬ì©ê°ë¥.
* ìì€í
ì íë¡ìžì ì ëìŽ ì¥ì°©ëë ë°©ìì ë€ìíš.
1. ë
늜ì ìž cpu center processor unit륌 ëŽì íë¡ìžì ì¹©ìŽ ì¬ë¬ ê° ë¬ëŠ¬ë ë°©ì.
2. í íë¡ìžì 칩 ìì ìœìŽcoreëŒ ë¶ë¥Žë ë
늜ì ìž cpuê° ì¬ë¬ê° ìë ë°©ì.
3. ì ëê°ë¥Œ íŒí©íë ë°©ì
- ì ì ê°ìŽ ì¬ë¬ ê° ë¬ëŠ° íë¡ìžì륌 - ë©í°ìœìŽ íë¡ìžì multicore processorëŒ ë¶ëŠ.
23.1 ë©í°ì€ë ë íë¡ê·žëë° ê°ë
- ì¬ë¬ ì°ì°ì ë³ë ¬ë¡ íš.
- cpuë¿ë§ ìëëŒ gpuëŒ ë¶ë¥Žë ê·žëíœ ì¹Žëì© íë¡ìžìë ë³ë ¬í ëìŽìì.
- ììŠ ê³ ì±ë¥ ê·žëíœ ì¹Žëë ìœìŽê° 4000ê° ìŽì.
* ë©í°ì€ë ëê° íìí ìŽì ë?
- 죌ìŽì§ ìì
ì ìì 묞ì ë€ë¡ ëë ì ê°ê°ì ë©í°íë¡ìžì ìì€í
ìì ë³ë ¬ë¡ ì€ííë©Ž ì±ë¥ í¥ì.
- ì°ì°ì ë€ë¥ž êŽì ìì 몚ëíí ì ìì.
- but, íì ë
늜 ìì
ì ëë ì ë³ë ¬í í ì ìë ê²ì ìë. ë©í°ì€ë ë íë¡ê·žëë°ì íëë° ìŽë €ìŽ
ë¶ë¶ì ë³ë ¬ ìê³ ëŠ¬ìŠì ê³ ìíë ê²ìŽë€. ìì
ì ì±ê²©ì ë°ëŒ 구í ë°©ììŽ í¬ê² ë¬ëŒì§.
ëí 겜ììí, êµì°© ìí(ë°ëëœ), í
ìŽë§tearing, ì못ë ê³µì false-sharingë± ê³Œ ê°ì 묞ì ê° ë°ìíì§
ìê² ë§ëëê²ë ìœì§ ìì. ê±°ì ìí 믹, ëª
ìì ìž ëêž°í ë©ì»€ëìŠìŒë¡ íŽê²°íš.
23.1.1 겜ììí
- ì¬ë¬ ì€ë ëê° ê³µì 늬ìì€ë¥Œ ëìì ì ê·Œí ë 겜ì ìíê° ë°ì (ë©ëªšëŠ¬ì ëë 겜ììí = ë°ìŽí° 겜ì)
23.1.2 í
ìŽë§ tearing
- ë°ìŽí° 겜ìì í¹ìí 겜ì°
- ìœêž° í
ìŽë§ torn read : ìŽë€ ì€ë ëê° ë©ëªšëŠ¬ì ë°ìŽí° ìŒë¶ë§ ì°ê³ ëëšžì§ ë¶ë¶ì ë¯žì² ì°ì§ 못í ìíìì
ë€ë¥ž ì€ë ëê° ìŽ ë°ìŽí°ë¥Œ ìœìŒë©Ž ë ì€ë ëê° ë³Žë ê°ìŽ ë¬ëŒì§.
- ì°êž° í
ìŽë§ torn write : ë ì€ë ëê° ë°ìŽí°ì ëìì ìž ë í ì€ë ëë ê·ž ë°ìŽí°ì í 쪜 ë¶ë¶ì ì°ê³ , ë€ë¥ž ì€ë ëë
ê·ž ë°ìŽí°ì ë€ë¥ž ë¶ë¶ì ìŒë€ë©Ž ê°ì ìíí ê²°ê³Œê° ë¬ëŒì§.
23.1.3 ë°ëëœ
- 겜ì ìí륌 ë§êž° ìíŽ ìíž ë°°ì ì ê°ì ëêž°í êž°ë²ì ì ì©íë€ ë³Žë©Ž ë°ìíë ë°ëëœ(êµì°©ìí)
- ì¬ë¬ ì€ë ëê° ìë¡ ìëë°© ìì
ìŽ ëë ëê°ì§ ëìì êž°ë€ëŠ¬ë ìí.
- ì€ë ëê° ê³µì 늬ìì€ì ì ê·Œíë €ë©Ž ì ê·Œ ê¶í ìì²ì íŽìŒíš. - 뮀í
ì€
[늬ìì€B]
â â
[ì€ë ë1] [ì€ë ë2]
â â
[늬ìì€A]
- ìŽë¬í ìí©ìŽ ë°ìíì§ ìê² íë €ë©Ž 몚ë ì€ë ëê° ìŒì í ììë¡ ëŠ¬ìì€ë¥Œ íëíŽìŒ íš.
* [íŽê²° ë°©ë²]
- 늬ìì€ ì ê·Œ ê¶íì ìì²íë ìì
ì ìê°ì íì ê².
- ìì ë°©ë²ë³Žë€ ìì ë°ìíì§ ìëë¡íë ê²ìŽ ë² ì€íž
- ì ê·Œ ê¶íì ê°ë³ì ìŒë¡ ìì²íì§ ìê³ , ìížë°°ì ì std::lock( ) std:: try_lock( )곌 ê°ì íšì륌 íì©
23.1.4 ì못ë ê³µì
- ìºìcacheë ìºì ëŒìž cache lineëšìë¡ ì²ëŠ¬.
- ìºìëŒìžì ë°ìŽí°ë¥Œ ì°ë €ë©Ž ë°ëì ê·ž ëŒìž ì 첎ì ëœì 걞ìŽìŒ íš.
- ë©í°ì€í
ë ìœë륌 ì€íí ë ë°ìŽí° 구조륌 ì ë§ë€ì§ ììŒë©Ž ìºìëŒìžì ëœì ê±°ë 곌ì ìì ì±ë¥ìŽ ëšìŽì§.
ex) ë ì€ë ëê° ë ê°ì§ ë°ìŽí° ììì ì¬ì©íëë° ë°ìŽí°ê° ê°ì ìºì ëŒìžì ê±žì³ ìë 겜ì°
- í ì€ë ëê° ë°ìŽí°ë¥Œ ì
ë°ìŽížíë©Ž ìºì ëŒìž ì 첎ì ëœì 걞ìŽë²ë € ë€ë¥ž ì€ë ëë êž°ë€ë €ìŒíš.
- ìŠ, ìºìëŒìžì ê±žì³ ìì§ ìëë¡ ë°ìŽí° êµ¬ì¡°ê° ì ì ë ë©ëªšëŠ¬ ììì ëª
ìì ìŒë¡ ì ë ¬íë©Ž ì¬ë¬ ì€ë ëê°
ì ê·Œ í ë ëêž°íì§ ìê² ë§ë€ìŽìŒ íš.
C++17 <new>í€ë íìŒì hardware_destructive_interference_size ëìì ì ê·Œíë ë ê°ì²Žê° ìºì
ëŒìžì ê³µì íì§ ìëë¡ ìµìíì ì€íì
23.2 ì€ë ë
23.2.1 íšì í¬ìží°ë¡ ì€ë ë ë§ë€êž°
- ìëì° ìì€í
ì CreateThread( ), _beginthread( ) pthreadsëŒìŽëžë¬ëŠ¬ì pthread_create( ) ì€ë ë íšìë 맀ê°ë³ì륌 íëë§ ë°ì.
- C++íì€ std::threadíŽëì€ìì ì¬ì©íë íšì 맀ê°ë³ì륌 ìíë ê°ìë§íŒ ë°ì ì ìì.
- thread íŽëì€ ìì±ìë ê°ë³ ìžì í
í늿 ìŽêž° ë묞ì ìžì ê°ì륌 ìíë ë§íŒ ì§ì ìŽ ê°ë¥íš.
- thread ( ì€ë ëê° ì€í í íšì, ì€ë ë 구ëëë©Žì ì€íí íšìì ì ë¬íë ìžì ê°ì)
- threadê°ì²Žê° ì€í ê°ë¥í ìíì ììë ì¡°ìž ê°ë¥ joinableíë€ê³ íí
- ëíŽëë¡ ìì±ë threadê°ì²Žë ì¡°ìž ë¶ê°ë¥ unjoinable
- ì¡°ìž ê°ë¥í threadê°ì²Žë¥Œ ì ê±°íë €ë©Ž 뚌ì ê·ž ê°ì²Žì joinìŽë detach ë¶í° ížì¶
- join( ) ížì¶ì ê·ž ì€ë ëë ëžë¡ ëë€. :ê·ž ì€ë ëê° ìì
ìŽ ëë ëê¹ì§ êž°ë€ëŠŒ
- detach( )륌 ížì¶íë©Ž thread ê°ì²Žë¥Œ osëŽë¶ì ì€ë ëì ë¶ëŠ¬íë€. ê·žëì os ì€ë ëë ë
늜ì ìŒë¡ ì€íëš.
- ì¡°ìž ê°ë¥ ìíì threadê°ì²Žë¥Œ ì ê±°íë©Ž ê·ž ê°ì²Žì ìë©žì std::terminate륌 ížì¶íŽì 몚ë ì€ë ëë¿ë§ ìëëŒ ì í늬ìŒìŽì
ë§ì ì¢
ë£.
- ì€ë ë íšìì ì ë¬í ìžìë íì ê·ž ì€ë ëì ëŽë¶ ì ì¥ìì ë³µì ëë€. ìžì륌 ë íŒë°ì€ë¡ ì ë¬íê³ ì¶ë€ë©Ž <functional>ì ì ìë std::refë cref륌 ì¬ì©íš.
23.2.2 íšì ê°ì²Žë¡ ì€ë ë ë§ë€êž°
- ì¥ì : íšì ê°ì²Žë¡ ë§ë€ë©Ž ê·ž íšì ê°ì²Žì íŽëì€ì ë©€ë² ë³ì륌 ì¶ê°íŽì ìíë ë°©ì±ìŒë¡ ìŽêž°ííŽì ì¬ì© ê°ë¥
- íŽëì€ë¥Œ íšì ê°ì²Žë¡ ë§ë€ë €ë©Ž operator( )륌 구ííŽìŒ íš. - 18ì¥
(1). ì ëíŒ ìŽêž°í thread t1
{Counter{1, 20}} * ì€êŽíž
(2). ìŒë° ë³ìì²ëŒ ë€ìë ìžì€íŽì€ë¡ ìŽêž°í
Counter c( 2, 12 ) <- ë€ìë ìžì€íŽì€
thread t2( c )
thread t2( ref(c) )
(3). ìì ê°ì²Žë¥Œ ì¬ì©
thread t3 (Counter(3, 10)) *ìêŽíž
íšì ê°ì²Ž ìì±ìê° ë§€ê°ë³ì륌 ë°ì§ ììëë íìì ê°ìŽ ìœë륌 ìì±íë©Ž ìë¬ê° ë°ìíë€.
- íšì ê°ì²Žë íì ì€ë ëì ëŽë¶ ì ì¥ìì ë³µì ëë€. íšì ê°ì²Žì ìžì€íŽì€ë¥Œ ë³µì íì§ ìê³ ê·ž ìžì€íŽì€ì ëíŽ operator( )
ì ížì¶íë €ë©Ž <functional>í€ëì ì ìë std::ref()ë cref()륌 ì¬ì©íŽì ìžì€íŽì€ ë íŒë°ì€ë¡ ì ë¬íŽìŒíë€.
23.2.3 ëë€ ííììŒë¡ ì€ë ë ë§ë€êž°
- ëë€ êµ¿ì.
23.2.4 ë©€ë² íšìë¡ ì€ë ë ë§ë€êž°
- ì€ë ëìì ì€íí ëŽì©ì íŽëì€ì ë©€ë² íšìë¡ ì§ì í ìë ìë€.
- thread t{&Request::process, &ref}
- í¹ì í ê°ì²Žì ìë ë©ìë륌 ì€ë ëë¡ ë¶ëŠ¬íŽì ì€íí ì ìë€.
23.2.5 ì€ë ë ë¡ì»¬ ì ì¥ì thread local storage
- ìíë ë³ìì thread_localìŽë í€ìë륌 ì§ì íŽì ì€ë ë ë¡ì»¬ ì ì¥ìë¡ ì§ìíë©Ž ì€ë ëë§ë€ ìŽ ë³ì륌 ë³µì íŽì
ì€ë ëê° ììŽì§ ëê¹ì§ ì ì§íë€. ìŽ ë³ìë ì€ë ëìì í ë²ë§ ìŽêž°í ëë€.
- thread_local ë³ì륌 íšì ì€ìœí ììì ì ìžíë©Ž 몚ë ì€ë ëê° ë³µì 볞ì ë°ë¡ ê°ê³ ìê³ , íšì륌 ì묎늬 ë§ìŽ ížì¶íëëŒê³
ì€ë ëë§ë€ ëš í ë²ë§ ìŽêž°íëë€ë ì ì ì ìžíë©Ž staticìŒë¡ ì ìží ëì ëê°ìŽ ìëíë€.
23.2.6 ì€ë ë ì·šìíêž°
- C++íì€ì ì€í ì€ìž ì€ë ë륌 ë€ë¥ž ì€ë ëìì ì€ëšìí€ë ë©ì»€ëìŠì ì ê³µíì§ ìì. ë°©ë²ì ?
1. ì¬ë¬ ì€ë ëê° ê³µíµìŒë¡ ë°ë¥Žë íµì ë©ì»€ëìŠì ì ê³µíëê²ìŽë€
2. ê³µì ë³ì륌 íì©íì
- ê°ì ì ë¬ ë°ì ì€ë ëë ìŽ ê°ì 죌Ʞì ìŒë¡ íìžíë©° ì€ëšì¬ë¶ë¥Œ ê²°ì íë€.
- 죌ì: ì¬ë¬ ì€ë ëê° ê³µì ë³ìì ì ê·Œíêž° ë묞ì ìµìí í ì€ë ëë ê·ž ë³ìì ê°ì ìžì ìë€. ë°ëŒì
ìŽ ë³ì륌 ìí 믹ìŽë 조걎 ë³ìë¡ ë§ëë ê²ìŽ ì¢ë€.
23.2.7 ì€ë ëë¡ ì€íí 결곌 ì»êž°
- 결곌륌 ëŽì ë³ìì ëí í¬ìží°ë ë íŒë°ì€ë¥Œ ì€ë ëë¡ ì ë¬íŽì ì€ë ëë§ë€ 결곌륌 ì ì¥íê² ë§ëŠ.
- íšìê°ì²Žì íŽëì€ ë©€ë² ë³ìì ì²ëŠ¬ 결곌륌 ì ì¥íë€ê° ëì€ì ì€ë ëê° ì¢
ë£í ë ê·ž ê°ì ê°ì žì€ë ê².
ë°ëì std::ref( )륌 ìŽì©íŽì íšì ê°ì²Žì ë íŒë°ì€ threadìì±ìì ì ë¬íŽìŒ íš.
- future륌 íì©.
23.2.8 ìµì
ì
ë³µì ì ë€ì ëì§êž°
- ì€ë ëìì ëì§ ìµì
ì
ì ê·ž ì€ë ë ììì ì²ëŠ¬íŽìŒ íš.
- ëì§ ìµì
ì
ì ì€ë ë ììì ì¡ì§ 못íë©Ž C++ë°íìì std::terminate( )륌 ížì¶íŽì ì í늬ìŒìŽì
ì 첎륌 ì¢
ë£ìíŽ.
- í ì€ë ëìì ëì§ ìµì
ì
ì ë€ë¥ž ì€ë ëìì ì¡ì ì ìì.
- ìµì
ì
êŽë š íšì륌 íì€ ì€ë ë ëŒìŽëžë¬ëŠ¬ìì ì ê³µíš.
ìŽ íšìë std::exception, int, string, 컀ì€í
ìµì
ì
ë±ìë ì ì©ëš.
* exception_ptr current_exception( ) noexcept;
* [[noreturn]] void rethrow_exception (exception_ptr p);
* template<class E> exception_ptr make_exception_ptr(E e) noexcept;
23.3 ìí 믹 ì°ì° ëŒìŽëžë¬ëŠ¬ <atomic>
- ìí 믹 íì
(atomic type)ì ì¬ì©íë©Ž ëêž°í êž°ë²ì ì ì©íì§ ìê³ ìœêž°ì ì°êž°ë¥Œ ëìì ì²ëŠ¬íë ìí 믹 ì ê·Œ(atomic access)ìŽ ê°ë¥íš.
- ìí 믹 ì°ì°ì ì¬ì©íì§ ìê³ ë³ìì ê°ì ìŠê°ìí€ë©Ž ì€ë ëì ìì íì§ ìì.
- 컎íìŒë¬ë 뚌ì ë©ëªšëŠ¬ìì ìŽ ê°ì ìœê³ , ë ì§ì€í°ë¡ ë¶ë¬ìì ê°ì ìŠê°ìíš ë€ì, ê·ž 결곌륌 ë©ëªšëŠ¬ì ë€ì ì ì¥íë€. ìŽ ê³Œì ìì ë©ëªšëŠ¬ ììì ë€ë¥ž ì€ë ëê° ê±Žë늬멎 ë°ìŽí° 겜ììŽ ë°ìíš.
- std::atomic íì
ì ì ì©íë©Ž 'mutex' 뮀í
ì€ ê°ì²Žì ê°ì ëêž°í êž°ë²ì ë°ë¡ ì¬ì©íì§ ìê³ ë ì€ë ëì ìì íê² ë§ë€ì ìì.
- ìí 믹 íì
ì ì¬ì©í ëë ëêž°í ë©ì»€ëìŠì ëª
ìì ìŒë¡ ì¬ì©íì§ ììë ëë€. but, í¹ì íì
ì ëíŽ ìí 믹 ì°ì°ìŒë¡ ì²ëŠ¬í ëë 뮀í
ì€ì ê°ì ëêž°í ë©ì»€ëìŠì ëŽë¶ì ìŒë¡ ì¬ì©íêž°ë íš.
- ì°ì°ì ìí 믹 ë°©ììŒë¡ ì²ëŠ¬íë ìžì€ížëì
(instruction)ì íê¹ íëìšìŽìì ì ê³µíì§ ììì ìì.
is_lock_free( )ë©ìë륌 ížì¶íŽì ì ê·žì§ ììë ëëì§ (ëœ í늬 lock- free) (~ã
.ã
)~ ♥ ~(ã
.ã
~)
ìŠ ëª
ìì ìŒë¡ ëêž°í ë©ì»€ëìŠì ì¬ì©íì§ ìê³ ë ìíí ì ìëì§ íìžíš.
- atomic íŽëì€ í
í늿ì ì ì íì
ë¿ë§ ìëëŒ ë€ë¥ž 몚ë ì¢
ë¥ì íì
ì ëíŽìë ì ì©í ì ìì.
23.3.1 ìí 믹 íì
ì¬ì©ì
void increment(int& counter)
{
for(int i = 0; i< 100 ; ++i)
{
++count;
this_thread::sleep_for(1ms); //std::this_thread::sleep_for( )
//std::chrono::durationíì
ì ìžì륌 íë ë°ëë€.
}
}
- increment( )íšì륌 ì€ííë ì€ë ë륌 ì¬ë¬ê° ë°ìŽë€ ê°ì
- counterë³ì íë륌 ì¬ë¬ ì€ë ëê° ê³µì íê² ëë€.
- ìí 믹, ì€ë ë ëêž°í ë©ì»€ëìŠì ì¬ì©íì§ ìê³ ëšìíê² êµ¬ííë©Ž ë°ìŽí° 겜ììŽ ë°ìíš.
int main ()
{
int count = 0;
vector<thread> threads;
for (int i = 0 ; i< 10; ++i)
{ threads.push_back(thread {increment, ref(counter)}); }
for (auto& t: threads) { t.join(); }
cout <<"Result =" <<counter <<endl;
}
- ìí 믹ì ì¬ì©íë©Ž ëêž°í ë©ì»€ëìŠì ë°ë¡ ì¶ê°íì§ ìê³ ë ì€ë ëì ìì íê³ ë°ìŽí° 겜ììŽ ë°ìíì§ ìê² ë§ë€ì ìì.
- ++counterì°ì°ì ìííëë° íìí ìì
ì íëì ìí 믹 ížëìì
ìŒë¡ ì²ëŠ¬íŽì ì€ê°ì ë€ë¥ž ì€ë ëê° ê°ì
í ì ìêž° ë묞ì.
23.3.2 ìí 믹 ì°ì°
* bool atomic<T>::compare_exchange_strong(T& expected, T desired)
* atomic<T>::fetch_add( ) : 죌ìŽì§ ìí 믹 íì
ì íì¬ ê°ì ê°ì žìì ì§ì í ê°ë§íŒ ìŠê°ìíš ë€ì, ì€ê°ìí€êž° ì ì ê°ì 늬íŽíš.
- ì ìí ìí 믹: fetch_add( ), fetch_sub( ), fetch_and( ), fetch_or( ), fetch_xor( ), ++, --, +=, -=. &=. ^=, |=
- í¬ìží° ìí 믹: fetch_add( ), fetch_sub( ), ++, --, +=, -=
- ëë¶ë¶ ìíë ë©ëªšëŠ¬ ìì륌 ì§ì íë 맀ê°ë³ì륌 ì¶ê°ë¡ ë°ì.
23.4 ìíž ë°°ì
- ë¶ìž, ì ì륌 ë¹ë¡¯í ì€ì¹ŒëŒê°ì ìí 믹 ì°ì°ìŒë¡ 충ë¶.
- ë³µì¡íê² êµ¬ì±ë ë°ìŽí°ë¥Œ ì¬ë¬ ì€ë ëê° ëìì ì ê·Œí ëë ëêž°í ë©ì»€ëìŠì ì¬ì©íš.
- íì€ ëŒìŽëžë¬ëŠ¬ë mutex, lock íŽëì€ë¥Œ íµíŽ ìíž ë°°ì ë©ì»€ëìŠì ì ê³µ
23.4.1 mutex
- mutexë ìíž ë°°ì 륌 ë»íë mutual exclusionì ì€ìë§ì.
- C++íì€ì [ìê° ì ìœìŽ ìë 뮀í
ì€ non-timed mutex], [ìê° ì ìœìŽ ìë 뮀í
ì€ timed mutex]íŽëì€ë¥Œ ì ê³µíš.
(1). [ìê° ì ìœìŽ ìë 뮀í
ì€ non-timed mutex]
- std::mutex -> header: <mutex>
- std::mutexë ìì ê¶ì ë
ì íë êž°ë¥ì ì ê³µíë íì€ ë®€í
ì€ íŽëì€ë€. í ì€ë ëë§ ê°ì§ì ìì.
ë€ë¥ž ì€ë ëê° ìŽ ë®€í
ì€ë¥Œ ìì íë €ë©Ž lock( )ì ížì¶íê³ ëêž°íš.
try_lock( )ížì¶íë©Ž ëœ ê±žêž°ì ì€íšíŽ 곧ë°ë¡ 늬íŽíš.
뮀í
ì€ë¥Œ ìŽë¯ž í볎í ì€ë ëê° ê°ì 뮀í
ì€ì ëíŽ lock( ), try_lock( )ì ë ížì¶íë©Ž ë°ëëœ ë°ìíë¯ë¡ ì¡°ì¬íŽìŒ íš.
- std::recursive_mutex -> header: <mutex>
recursive_mutex륌 í볎í ì€ë ëê° ëìŒí recursive_mutexì ëíŽ lock , try_lockì ë ížì¶í ì ìë€.
- std::shard_mutex -> header: <shared_mutex>
ê³µì ëœ ìì ê¶ shard lock ownership
ìœêž°-ì°êž° ëœ reader-writer lock
ë
ì ìì ê¶ exclusive ownership
ê³µì ìì ê¶ shard ownership
ë
ì ìì ê¶ ëë ì°êž°ëœì ë€ë¥ž ì°ë ëê° ë
ì ìì ê¶ìŽë ê³µì ìì ê¶ì ê°ì§ê³ ìì§ ìì ëë§ ì»ì ì ìë€.
lock_shared( ), try_lock_shared(), unlock_shared()ì ê°ì ê³µì ìì ê¶ êŽë š ë©ìë륌 ì ê³µ
(2). [ìê° ì ìœìŽ ìë 뮀í
ì€ timed mutex]
- std::timed_mutex -> header: <mutex>
- std::recursive_timed_mutex -> header: <mutex>
- try_lock_for (rel_time)
- try_lock_until (abs_time)
- std::shard_timed_mutex -> header: <shared_mutex>
- try_lock_shared_for (rel_time)
- try_lock_shared_until (abs_time)
23.4.2 Lock
- RAII( Resource Acquisition Is Initialization )ìì¹ìŽ ì ì©ëë íŽëì€
- 뮀í
ì€ì ëœì ì íí 걞거ë íŽì íë ìì
ì ìœê² ì²ëŠ¬íê² íŽì€.
- lock íŽëì€ì ìë©žìë í볎íë 뮀í
ì€ë¥Œ ìëìŒë¡ íŽì ìíŽ.
- C++íì€ììë std::lock_guard, std::unique_lock, std::shared_lock, std::scoped_lock (C++17ìì ì¶ê°)
* lock_guard -> header: <mutex>
* std::unique_lock -> header: <mutex>
- ëœì ì ìžíê³ íì°ž ë€ ì€íë ë ëœì 걞ëë¡ ì§ì°ìí€ë ê³ êž êž°ë¥ì ì ê³µ
* std::shared_lock -> header: <shared_mutex>
- ëŽë¶ ê³µì 뮀í
ì€ì ëíŽ ê³µì ìì ê¶ì êŽë šë ë©ìë륌 ížì¶íë ë€ë¥ž ì ìŽ ìì.
* í ë²ì ì¬ë¬ ê°ì ëœì ëìì 걞Ʞ
- lock( ) ì§ì - ëœì ê±°ë ììë ìì ìë€.
- ìŽë íëì 뮀í
ì€ ëœì ëíŽ ìµì
ì
ìŽ ë°ìíë©Ž ìŽë¯ž í볎í ëœì ëíŽ unlock( )ì ížì¶íë€.
- try_lock ( )
* scoped_lock -> header: <mutex>
- std::lock_guardì ë¹ì·íì§ë§ 뮀í
ì€ë¥Œ ì§ì íë ìžì ê°ìì ì íìŽìë€.
- C++17ì ì¶ê°ë ìì±ìì ëí í
í늿 ìžì ì¶ë¡ êž°ë¥ì ì ì©ë ê°ë¥íš.
scoped_lock locks(mut1, mut2);
23.4.3 std::call_once
- std::call_onceì once_flag륌 íšê» ì¬ì©íë©Ž once_flagì ëí ì¬ë¬ ì€ë ëê° call_once륌 ížì¶íëëŒë call_onceì ìžìë¡ ì§ì í íšìë
ë©ìëê° ëš íë²ë§ ížì¶ëê² í ì ìë€. ì§ì í íšìê°ì
ì
ì
ì ëì§ì§ ìì ë ìŽë ê² ížì¶íë ê²ì ìŽíí°ëžcall_once ížì¶ìŽëŒê³ ë¶ë¥žë€.
23.5 조걎 ë³ì condition variable
- ë€ë¥ž ì€ë ëê° ì¡°ê±Žì ì€ì íêž° ì ìŽë ë°ë¡ ì§ì í ìê°ìŽ 겜곌íêž° ì ê¹ì§ ì€ë ëì ì€íì ë©ì¶ê³ êž°ë€ëŠ¬ê² í ì ìì.
- ì€ë ë íµì ì 구íí ì ìì.
- <condition_variable> std::condition_variable std::condition_variable_any
23.5.1 ë¹ì ìì ìŒë¡ 깚ìŽëêž°
- 조걎 ë³ì륌 êž°ë€ëŠ¬ë ì€ë ëë ë€ë¥ž ì€ë ëê° notify_one( )ìŽë contify_all( )ì ížì¶í ëê¹ì§ êž°ë€ëŠŒ.
ê·žë°ë° ìŽë ê² ë¯žëŠ¬ ì§ì ë ìì ì ë€ë€ë¥Žì§ ììëë° ë¹ì ìì ìŒë¡ 깚ìŽë ìë ìì.
-íë ëìŒìŽížë¥Œ ìžìë¡ ë°ë wait( ) 륌 ì¬ì©íì¬ ìŽì 륌 ê²ì¬íŽìŒíš.
23.6 promise( std::promise )ì future( std::future )
- future륌 ì¬ì©íë©Ž ì€ë ëì ì€í 결곌륌 ìœê² ë°ìì¬ ì ìì ë¿ë§ ìëëŒ ìµì
ì
ì ë€ë¥ž ì€ë ëë¡ ì ë¬íŽì
ìíë ë°©ììŒë¡ ì²ëŠ¬í ì ìì.
- ì€ë ëì ì€í 결곌륌 promiseì ëŽìŒë©Ž futureë¡ ê·ž ê°ì ê°ì žì¬ ì ìì.
- ì±ëì ë¹ì íë©Ž promiseë ì
ë ¥ í¬íž, futureë ì¶ë ¥ í¬ížìž ì
.
- set_exception()ì ížì¶íŽì ìµì
ì
ì promiseì ì ì¥í ì ìì.
- futureì ê°ì¥ í° ì¥ì ì ì€ë ëëŒëŠ¬ ìµì
ì
ì ì£Œê³ ë°ëë° íì©í ì ìë€ë ê².
- get( )ì ì¬ë¬ ì€ë ëì ëíŽ ì¬ë¬ë² ížì¶íê³ ì¶ë€ë©Ž std::shared_future<T>륌 ì¬ì©íš.
23.6.2 std::packaged_task
- std::promise륌 ëª
ìì ìŒë¡ ì¬ì©íì§ ìê³ ë promise륌 구íí ì ìì.
23.6.3 std::async ììŽì±í¬, ìŽì±í¬
- ì€ë ëë¡ ê³ì°íë ìì
ì C++ë°íììŒë¡ ì¢ ë ì ìŽíê³ ì¶ë€ë©Ž std::async( )륌 ì¬ì©íš.
- íšì륌 ì€ë ëë¡ ë§ë€ìŽ ë¹ëêž°ììŒë¡ 구ëíš.
- ì€ë ë륌 ë°ë¡ ë§ë€ì§ ìê³ , 늬íŽë futureì ëíŽ get( )ì ížì¶í ë ëêž°ììŒë¡ íšì륌 ì€ííš.
23.8 ì€ë ë í
- íë¡ê·žëë°ì 구ëí ëë¶í° ì¢
ë£í ëê¹ì§ ì€ë ë륌 íìí ëë§ë€ ìì±íë€ ìì íë ììŒë¡ 구ííì§ ë§ê³ ,
íìí ìë§íŒ ì€ë ë í thread poolì 구ì±íŽë ëš.
- ì£Œë¡ í¹ì í ì¢
ë¥ì ìŽë²€ížë¥Œ ì²ëŠ¬í ë ìŽ êž°ë²ì ì ì©íš.
- ìŒë°ì ìŒë¡ íë¡ìžì ìœìŽ ìë§íŒ ì€ë ë륌 ìì±íë ê²ìŽ ì ì íš.
â» ìžì€ížëì
(instruction)ì 컎íší°ìê² ìŒì ìí€ë ëšìë¡ì, 컎íší°ê° ììë€ì ì ìë êž°ê³ìŽë¡ ìŽë£šìŽì ž
ìë ëª
ë ¹ìŽë€. ì§ì ëë ëª
ë ¹ìŽëŒê³ íš.
ì¶ì²: ì 묞ê°ë¥Œ ìí C++
'ðšð»âð» programming > ✠c, c++' 칎í ê³ ëŠ¬ì ë€ë¥ž êž
ì íë ê² ë³Žë€ ë«ê² ì§
í¬ì€í ìŽ ì¢ìë€ë©Ž "ì¢ììâ€ïž" ëë "구ë ðð»" íŽì£Œìžì!