λͺ©λ‘μ 체 κΈ (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cnUSTU/btsnE9AaEQs/hk8xTYJN0IG80w0tThUkOK/img.png)
[C++ κ²μ μλ²] 1-10. Condition Variable (쑰건 λ³μ) ν΅μ¬ : 1. 쑰건 λ³μ(Condition Variable) μ μ μ λ 벨 μ€λΈμ νΈλ‘, λμΌν νλ‘κ·Έλ¨ λ΄μμ μ κ·Ό κ°λ₯νλ€. 2. 쑰건 λ³μλ₯Ό μ΄μ©νλ©΄ νλμ μ°λ λ νΉμ λͺ¨λ μ°λ λμ μκ·Έλμ μ λ¬ν μ μλ€. 3. 쑰건 λ³μλ Lock κ³Ό νμ΄λ₯Ό μ΄λ£¨μ΄ μ¬μ©νλ€! μ λ²μ Handle μ μ΄μ©ν΄ μ΄λ²€νΈλ₯Ό ꡬννλ κ²μ μ‘°κΈ λ°μ μμΌ, μ΄λ²μλ condition variable μ μ¬μ©ν΄λ³Ό κ²μ΄λ€. μ¬μ€ condition variable μ Handle μ μ¬μ©νλ κ²λ³΄λ€ μ‘°κΈ λ μ°μν(?) λ°©μμ΄λ©°, 쑰건μ 체ν¬νμ¬ λ½μ μ‘κ³ νΈλ κΈ°λ₯μ μ κ³΅ν΄ μ€λ€. λν condition variable μ μ μ λ 벨 μ€λΈμ νΈμ΄λ―λ‘..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kQafP/btsnELGcktv/HlMwNhBW7U4E0WVmZF15IK/img.png)
[C++ κ²μ μλ²] 1-9. μ΄λ²€νΈ ꡬν (+ Handle) ν΅μ¬ : 1. μ΄λ²€νΈλ₯Ό μ¬μ©νλ©΄ SpinLock μ λΉν΄ CPU λλΉλ₯Ό μ€μΌ μ μλ μ₯μ μ΄ μλ€. 2. μ΄λ²€νΈμ κ°λ μ κ°λ¨νλ€. νΈλ€μ λ§λ ν, Consumer λ νΈλ€μ μ°Έκ³ νμ¬ κΉ¨μΈ λκΉμ§ μ€λΉ μνμ λ€μ΄κ°κ³ , Producer κ° μ€λΉκ° λμμ λ νΈλ€μκ² μ΄λ²€νΈλ₯Ό 보λ΄κΈ°λ§ νλ©΄ λλ€. 3. νΈλ€μ 컀λ μ€λΈμ νΈμ ν΄λΉνμ¬, μ¬λ¬ μ°λ λκ° μ΄λ₯Ό νμ©ν μ μλ€. μ΄μ Lock ꡬνμ ν¨μ μμ΄ '무μμ κΈ°λ€λ¦¬κΈ°' μ 'μ κΉ κΈ°λ€λ¦¬κΈ°' λ₯Ό ꡬνν΄ λ³΄μμΌλ, λ§μ§λ§ μμκ° λ¨μμλ€. λ°λ‘... 'μ 3μκ° κΉ¨μμ£ΌκΈ°' μΈλ°, μ¬κΈ°μ 'μ 3μ'λΌ ν¨μ μΌλ°μ μΌλ‘ OS μ μ€μΌμ€λ¬λ₯Ό μλ―Ένκ³ , 'κΉ¨μμ€λ€' λ κ²μ ν΄λΉ μ°λ λμ μκ·Έλμ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ceYb7O/btsnocLuDSY/q760LVGVBI1zFHsIq2uMa1/img.png)
[C++ κ²μ μλ²] 1-8. Sleep κ°λ κ³Ό ꡬν ν΅μ¬ : 1. Lock μ μ‘μ μ μμ λ, μΌμ μκ° λμ κΈ°λ€λ¦¬κ² ν λ sleep μ μ¬μ©νλ€. 2. Sleep μ μ¬μ©νλ©΄ μΌμ μκ° λμ ν΄λΉ μ°λ λλ μ€λΉ μνμ μλ€κ° λ€μ λμμ¨λ€. μ΄ μκ°λμμλ CPU μμμ μ¬μ©νμ§ μλλ€. λμ Kernel Space λ‘ μ νλλ κ³Όμ μμμ λΉμ©μ λ°μνλ€(컨ν μ€νΈ μ€μμΉ). 3. yield λ μ°λ λμκ² μ£Όμ΄μ§ Time Slice λ₯Ό μ¦μ λ°λ©νλλ‘ νλ©°, μ€μΌμ€λ¬μκ² μ°λ λκ° μ΄λ€ μΌμ ν μ§ μμμ μ ν΄λ¬λΌκ³ μμ²μ νκ² λλ€. μ΄μ μ Lock ꡬν μ΄λ‘ μμ μ€λͺ ν κ² μ€ λλ²μ§ΈμΈ, 'λλ€ μκ° ν 볡κ·' λ©νκ° λ°λ‘ sleep μ΄λ€. μ΄μ κΈμμ SpinLock μ μ΄μ©ν΄ '무μμ κΈ°λ€λ¦¬λ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pEz3M/btsng8uHgPK/OFL5hgz9SBVAXr3yitQCi1/img.png)
[C++ κ²μ μλ²] 1-7. SpinLock ν΅μ¬ : 1. SpinLock μ Lock μ μ‘κΈ° μν΄ '무μμ κΈ°λ€λ¦¬λ' λ°©μμ΄λ€. 2. SpinLock μ atomic λ³μμ lock, unlock ν¨μλ‘ μ½κ² λ§λ€ μ μλ€. compare_exchange_strong ν¨μλ₯Ό κΈ°μ΅νμ. 3. SpinLock μ λΆνμν CPU clock μ λλΉνμ§λ§, λλ‘λ 컨ν μ€νΈ μ€μμΉμ λλ κ²λ³΄λ€ λΉμ©μ΄ μ λ ΄ν μλ μλ€. μ΄μ 본격μ μΌλ‘ SpinLock μ ꡬνν΄ λ³΄μ. SpinLock μ κ°λ¨νλ€. κ·Έλ₯ Lock μ μ‘μ λκΉμ§ 무μμ While λ¬Έμ λλ©΄μ κΈ°λ€λ¦¬λλ‘ λ§λ€ κ²μ΄λ€ π€£ κ°λ¨νκ² μκ°νλ©΄ μλμ κ°μ΄ ꡬννκ² μ§λ§... int sum = 0; class SpinLock { private: b..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/E5KtP/btsngsgdxOa/cfhYekF0YCXIkkeIj42260/img.png)
[C++ κ²μ μλ²] 1-6. Lock ꡬν μ΄λ‘ ν΅μ¬ : 1. Lock μ ꡬννλ λ°©μμ ν¬κ² μΈ κ°μ§λ‘ λλλ€. 무μμ κΈ°λ€λ¦¬κΈ°, μ μ ν λμμ€κΈ°, κΉ¨μμ€ λκΉμ§ κΈ°λ€λ¦¬κΈ° 2. SpinLock μ μ¬μ©νμ¬ λ¬΄μμ κΈ°λ€λ¦¬κ±°λ, μ΄λ μ λ Sleep μ νκ³ λ ν Lock μ λ€μ μ‘μΌλ €κ³ μλν μλ μλ€. 3. νΉμ λ€λ₯Έ μΌμ νλ€κ°, Lock μ μ‘μ μ μκ² λλ μνκ° λμμ λ λ Έν°λ₯Ό λ¬λΌκ³ μμ²ν μλ μλ€. μλ₯Ό λ€μ΄ Condition Variable μ΄ μλ€. μ΄ κ³Όμ μμ 컨ν μ€νΈ μ€μμΉμ΄ μΌμ΄λ μ μλ€! 본격μ μΌλ‘ Lock μ ꡬννκΈ° μ , Lock μ ꡬννλ μΌλ°μ μΈ λ°©μ 3 κ°μ§μ λν΄ λ¨Όμ μκ°νκ³ κ°λλ‘ νκ² λ€. μ¬μ€ λ΄μ©μ κ°λ¨νλ€. Lock μ΄ μ΄λ―Έ κ±Έλ¦° μνλΌκ³ ν ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/M9vUO/btsnamsDGPy/v2B804Wqn1Zayxdff3HjnK/img.png)
[C++ κ²μ μλ²] 1-5. DeadLock μ κ°λ κ³Ό κΈ°μ΄ (+ std::lock) ν΅μ¬ : 1. DeadLock μν©μ, μ¬λ¬ μ°λ λλ€μ΄ Lock μ μλ‘ μ‘κ³ μμ΄ νκ±°λ μλ‘ μ‘μ§ λͺ»νλ κ΅μ°© μνλ₯Ό μλ―Ένλ€. 2. DeadLock μν©μ Lock μ μ‘λ μμλ₯Ό μ μ‘°μ νκ±°λ, μ μ ν Lock μ μ¬μ©νμ¬ ννΌν μ μλ€. 3. std::lock μ μ¬λ¬ κ°μ Lock μ DeadLock μμ΄ νκΊΌλ²μ μ‘μ μ μλλ‘ λμμ€λ€. λ€μκ³Ό κ°μ΄, Lock μ΄ 2κ° μ‘΄μ¬νκ³ μ°μ°μ μν΄ Lock 2 κ°λ₯Ό μ λΆ μ‘μμΌ νλ€κ³ κ°μ νμ. int sum = 0; mutex mutexAdd; mutex mutexSub; void Add() { for (int i = 0; i < 1000; ++i) { mu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bV2psD/btsm4B5NqTf/AKwSDNG21vPHVgaxZftkHk/img.png)
[C++ κ²μ μλ²] 1-1. λ©ν°μ°λ λ κ°λ‘ ν΅μ¬ : 1. Critical Section μ μ§μ ν λλ mutex λ±μ νμ©νμ¬ Lock μ κ±Έλ©΄ Race Condition μ ν΄μν μ μλ€. 2. μΌλ°μ μΌλ‘ μ§μ lock/unlock μ ν΄μ£ΌκΈ° 보λ€, lock_guard λ unique_lock μ μ¬μ©νμ¬ RAII λ°©μμΌλ‘ Lock μ κ±Έμ΄ μ£Όλ κ²μ΄ μ’λ€. 3. unique_lock μ κ²½μ°, defer_lock λ±μ μ΅μ μ μ£Όμ΄ Lock Guard λ₯Ό μ’ λ μ μ°νκ² μ¬μ©ν μ μλ€. λ€λ§ lock_guard μ λΉν΄ λ©λͺ¨λ¦¬λ₯Ό λ λ§μ΄ μ°¨μ§νκ³ λ¬΄κ±°μ κ²μ΄λ€. λ€μκ³Ό κ°μ΄ μ¬λ¬ μ°λ λλ₯Ό μ΄μ©ν΄ 벑ν°μ μμλ₯Ό μ½μ νλ€κ³ ν΄ λ³΄μ : vector vec; void Push() { for (int..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bEXxlF/btsm8P29YuW/hkJtGzxqcOYnnHOY3QOEL1/img.png)
[C++ κ²μ μλ²] 1-3. atomic μ λνμ¬ ν΅μ¬ : 1. ++, -- κ°μ κ°λ¨ν μ°μ°μ‘°μ°¨, μ¬μ€ μ΄μ λΈλ¦¬μ΄μμλ 'κ° λ³΅μ¬' -> '볡μ¬λ κ°μ μ°μ° μν' -> '볡μ¬λ κ°μ λ€μ λμ ' κ°μ κ³Όμ μΌλ‘ μͺΌκ°μ§λ€ 2. λ§μ½ νΉμ μ°μ°μ΄ μ§ν μ€μΌ κ²½μ°, λ€λ₯Έ μ°μ°μ΄ λΌμ΄λ€μ§ μλλ‘ λ§λ€κ³ μΆλ€λ©΄, ν΄λΉ λ³μλ₯Ό atomic μΌλ‘ μ μΈν μ μλ€. 3. μΌλ°μ μΌλ‘ atomic μ°μ°μ μΌλ° μ°μ°λ³΄λ€ λ리λ―λ‘, λ¨μ©μ μ§μνμ¬μΌ νλ€. μ΄λ€ μ°μ°μ΄ atomic (μμμ ) μΌλ‘ μ΄λ£¨μ΄μ§λ€λ κ²μ, ν΄λΉ μ°μ°μ΄ μ§νλλ μ€κ°μ λ€λ₯Έ μ°μ°μ΄ λμμ μ§νλμ§ μλλ€λ κ²μ μλ―Ένλ€. μ΄μ μ μ¬λ¬ μ°λ λλ€μ΄ 곡μ μμμ μ κ·Όνλ € ν λ Race Condition μ΄ λ°μν μ μλ€κ³ μ΄μΌκΈ°ν μ μ΄ μλλ°, ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/FWeeE/btsm2HKpwfC/nTXPvcVzf2kbb0wYxhADn1/img.png)
μ°λ λ μμ± ν΅μ¬ : 1. μ°λ λλ₯Ό μμ±νλ λ°©λ²μ κ°λ¨νλ€. κ·Έλ₯ std::thread μ μλ§μ ν¨μλ₯Ό λ£μ΄μ£ΌκΈ°λ§ νλ©΄ λλ€. 2. μ°λ λλ₯Ό λ«μμ€ λλ join μΌλ‘ λ«μμ£Όλ©΄ λλ€! λ«κΈ° μ , joinable λ‘ join κ°λ₯νμ§λ₯Ό 체ν¬νλ€. 3. μ°λ λ κ°μ²΄ μμ± μ, ν¨μμ μΈμμ λ§κ² κ°―μλ₯Ό λ£μ΄μ£Όμ΄μΌ μ λμν κ²μ΄λ€. μ°λ λ κ°μ²΄ μμ±μ λ΄λΆλ κ°λ³ κΈΈμ΄ ν νλ¦ΏμΌλ‘ ꡬνλμ΄ μλ€. μ΄μ μ°λ λλ₯Ό μμ±νλ κΈ°μ΄μ μΈ μ€μ΅λΆν° μ§νν΄ λ³΄μ π #include "pch.h" #include #include "CorePch.h" #include #include #include #include using namespace std; void HelloThread() { cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bfdUQ0/btsm4C9Y6PQ/nscaWruSHLvFKxEekoxZV1/img.png)
[C++ κ²μ μλ²] 1-1. λ©ν°μ°λ λ κ°λ‘ ν΅μ¬ : 1. λ©ν°μ°λ λ νλ‘κ·Έλλ°μ μλΉμ μ΄μνλ κ²κ³Ό λΉμ·νλ€. ν μ΄λΈμ νλ‘μΈμ€, ν μ΄λΈμμ μΌνλ μ§μμ μ°λ λ, μνΌμ μ½μ΄λΌκ³ μκ°νλ©΄ νΈνλ€. 2. μ°λ λλ ν μμμ 곡μ νμ§λ§, κ°κ°μ μ 보λ₯Ό μ€νμ μ μ₯νλ€. λ°λΌμ ν μμμ μ κ·Όν λλ Race Condition μ΄ λ°μν μ μλ€. λ©ν°μ°λ λ νλ‘κ·Έλλ°μ μλΉμ μ΄μνλ κ²κ³Ό λΉμ·νλ€. ν μ΄λΈμ νλ‘κ·Έλ¨, μ§μμ μ°λ λ, μνΌμ CPU μ½μ΄λΌκ³ μκ°νμ. κ·ΈλΌ μνΌμ΄ μ§μμκ² λ€μ΄κ°μΌ νλ‘κ·Έλ¨μ΄ λμκ° κ²μ΄λ€. μ΄μ μ°λ¦¬κ° ν΄μΌ ν μΌμ, μνΌμ μ§μμκ² μ΄λ»κ² λΆλ°°ν΄μΌ μ’μμ§ κ΅¬μ‘°λ₯Ό μ€κ³νκ³ μ½λλ₯Ό μ§λ κ²μ΄λ€! μ€μ λ‘ μμ μ€μ·μ²λΌ, CPU μ½μ΄λ₯Ό μ μ ν λ°°λΆνλ©΄μ μκΈ°λ λ¬Έμ λ₯Ό μ..