Rokgeun
@rmswjd
Reviews Written
-
Average Rating
-
Posts
Q&A
๋ณดํธ์ฐธ์กฐ ๊ด๋ จ ์ง๋ฌธ
์ ๋ ๊ฐ์ ๋ถ๋ถ์ ๊ถ๊ธ์ฆ์ ๊ฐ์ ธ์ ์ฝ์งํด๋ณธ ๊ฒฐ๊ณผ ๊ทธ๋๋ง ํฉ๋ฆฌ์ ์ธ ์ถ์ธก์ ํ ์ ์์์ต๋๋ค. 1. Job ์์ฑ์์ ๋ง์ง๋ง ์ธ์ Args&&... arg๋ ๋ณดํธ ์ฐธ์กฐ๊ฐ ์๋๋๋ค. ๊ทธ ์ด์ ๋ ์์ ๋ ๋ฒ์งธ ์ธ์์ธ Ret(T::* memFunc)(Args...) ์์ Args๊ฐ ๋จผ์ ์ถ๋ก ๋๊ณ ์ดํ ๋ง์ง๋ง ์ธ์์ธ Args๋ ์ถ๋ก ์ด ๋์ง ์์ต๋๋ค. (non-deduced) ์ฆ, ์ด๋ฏธ ์ถ๋ก ๋ ํ์ ์ &&๊ฐ ๋ถ๊ฒ ๋ฉ๋๋ค. ์ด ๋ง์ ๋ง์ง๋ง ์ธ์๋ ํญ์ rvalue reference๊ฐ ๋๋ค๋ ์๋ฏธ์ด์ฃ .2. std::forward๋ ํ ํ๋ฆฟ ์ธ์ T์ ์ฐธ์กฐ๊ฐ ๋ถ์ง ์์ผ๋ฉด rvalue๋ก ์บ์คํ ํ์ฌ ๋ฆฌํดํด์ค๋๋ค. PushJob์ ์ ์๋ฅผ ๋ณด๋ฉด Args๋ ๋ณดํธ์ฐธ์กฐ๊ฐ ์๋ ์ผ๋ฐ lvalue๋ง์ ๋ฐ๋ ํ ํ๋ฆฟ ํ์์ ๋๋ค. ์ฌ๊ธฐ์ ๋ฐ์ ๋น์ฐธ์กฐ ํ์ lvalue๋ฅผ forward๋ฅผ ํตํด rvalue๋ก ์บ์คํ ํ ํ MakeShared์ ๋๊ฒจ์ฃผ๊ณ , ์ด ์์์๋ ๊ณ์ perfect forwarding์ ํตํด ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ณด์กดํ ์ฑ placement new(์์ฑ์ ํธ์ถ)๊น์ง ๋๋ฌํ๊ฒ ๋ฉ๋๋ค.์๋ง ํ ์คํธ์์ std::forward(player)๋ฅผ Job ์์ฑ์์ ๋ฐ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๊ฐ์ด ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ฌ๊ฒ๋๋ค.3. 1๋ฒ์ ๋ต๋ณ๊ณผ ์ผ๋งฅ์ํต ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ์ด์ ๊ฐ์ด ์ดํดํ๊ณ ๋์ด๊ฐ๋ ค ํ๋ฉฐ ์ ํํ์ง ์์ ์ ๋ณด์ผ ์ ์์ผ๋ ๋ ์ ํํ ์ ๋ณด๋ฅผ ์ํด์๋ cppreference์ ํ ํ๋ฆฟ ์ถ๋ก ๊ท์น ์ํฐํด์ด๋ ๋ชจ๋ c++์ ํ ํ๋ฆฟ ์ถ๋ก ์ฑํฐ๋ฅผ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค!
- 1
- 1
- 180
Q&A
Lock-Free Stack #2 ๊ฐ์ ์ง๋ฌธ
์ ๋ ๋น์ทํ ์๊ฐ์ ํ์๋๋ฐ ์๊ฐ์ ์ข ์ ๋ฆฌํด๋ณธ ๊ฒฐ๊ณผ ์ด๋ฌํ ์ํฉ์ ๊ณ ๋ คํด๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.Node* OldHead = Head.load(); while (OldHead && !Head.compare_exchange_weak(OldHead, OldHead->Next)) {};๋ ์ค๋ ๋๊ฐ ๊ฐ์ด popํจ์์ ๋ค์ด์จ ์ํ๋ผ๊ณ ํ์ ๋, ๋จผ์ ํ ์ค๋ ๋๊ฐ oldHead๋ฅผ ํ๋ํ๊ณ ์นด์ดํ ์ ํ์ง ์๊ณ ์ด oldHead๋ฅผ ์ญ์ ํ๋ค๊ณ ํด๋ด ์๋ค. ๊ทธ๋ฐ๋ฐ, ์ญ์ ํ๊ธฐ ์ ์ ์ด๋ฏธ ํ๋ํ ์ค๋ ๋ ๋ง๊ณ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ฐ์ Head๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐ์ oldHead๋ฅผ ํ๋ํ ์ํ๋ผ๊ณ ํ๊ณ , ์ดํ ๋ค๋ฅธ ์ค๋ ๋์์ ์ด๊ฒ์ ์ญ์ ํ๊ณ ๋๋จธ์ง ์ค๋ ๋๊ฐ ๋ค๋ฆ๊ฒ CAS ํจ์๋ฅผ ํธ์ถํ๋ค๋ฉด OldHead->Next์์ ํฌ๋์ฌ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.์ฆ, 1. Node* oldHead = _head ์ค์ ๊ฑฐ์ ๋์์ ์งํํ์ฌ ๊ฐ์ oldHead๋ฅผ ํ๋ํ ์ค๋ ๋๊ฐ ๋ ๊ฐ๊ฐ ์๋ค. (PopCount 2๊ฐ)์ด ๋ ํ ์ค๋ ๋๊ฐ CAS๋ฅผ ํต๊ณผํ๊ณ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ญ์ ๋ฅผ ํ๋๋ฐ ์ด์ ๋์์ ๋๋จธ์ง ์ค๋ ๋๊ฐ CAS๋ฅผ ๋ค์ด๊ฐ๋ค๋ฉด, ์ด ์๋๋ฆฌ๊ฐ ํฐ์ง๋ค๋ฉด ํฌ๋์ฌ๊ฐ ๋ฐ์ํ๋ค. (๊ฑฐ์ ๋์์ ๋ค์ด์์ง๋ง ํ ์ชฝ์ CAS๋ฅผ ํต๊ณผํ๊ณ deleteํ๋ ๋์ ๋ค๋ฅธ ํ ์ชฝ์ ๊ฐ๋งํ ์๋ค๊ฐ ์ด์ ์์ผ CAS๋ฅผ ์๋ํ๋ ์ด ์๋ค๋ฆฌ๊ฐ ๋ฌด์ํ ๋ง์ ์ค๋ ๋์์ ๋ฎ์ ํ๋ฅ ๋ก ๋ฐ์ํ์ง ์์๊น..? ์ถ์ต๋๋ค)
- 1
- 1
- 243
Q&A
WaitForSingleObject์ Auto reset ์ฒ๋ฆฌ๋ ์์์ ์ธ๊ฐ์
์ด ์ง๋ฌธ์ ๋ณด๊ณ ์ ๋ ์ ํํ ๋ต๋ณ์ด ๊ถ๊ธํ์ฌ ์ ์๊ฐ์ข ๋์ ์ด๊ณ ๊ฐ๋๋ค.์์ ํ๋ฆฐ ์๊ฐ์ผ ์ ์์ผ๋, Rookiss ์ ์๋์ ๊ณต์ ๋ต๋ณ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๊ทธ๋ฅ ํ๋ฌ๋๊ธฐ๋ฏ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค!์ ๊ฐ ์ดํดํ ๋ฐ๋ก๋, WaitForSingleObject()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค ๋ ๋ถ์ฌ๋ฐ์ handle์ ์ด๋ฒคํธ๋ฅผ ์ฐธ์กฐํ์ฌ signal state๋ฅผ ํ์ธํ๋ ๊ฒ์ผ๋ก ์ดํดํ์ต๋๋ค. ์ฆ ์ธ์๋ก ๋ฃ์ด์ค handle ์ด๋ฒคํธ์ state๋ฅผ ํ์ธํ์ฌ ์๊ทธ๋์ด ์ผ์ ธ ์๋์ง ํ์ธ ํ ๋ฆฌํด ๊ฐ์ ๋ณด๋ด์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฆฌํด ๊ฐ๋ค์ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์ ๋์์์ต๋๋ค.๊ฒฐ๊ตญ ํ๋ก๋์ ์ค๋ ๋๊ฐ SetEvent()๋ฅผ ํธ์ถํ๋ฉด, ์ปค๋์ ์ธ์๋ก ๋ฃ์ด์ค ์ด๋ฒคํธ handle์ ์ฐธ์กฐํ์ฌ ์ปค๋๋จ์์ ์ด ์๊ทธ๋ state๋ฅผ ์ผ์ฃผ๋ ๊ฒ์ผ๋ก ๋ณด์ด๊ณ , ์ปจ์๋จธ ์ค๋ ๋๋ WaitForSingleObject()๋ก ์ด ์๊ทธ๋์ ํ์ธํ๊ณ ์ผ์ ธ์๋ค๋ฉด ๋ชจ๋๋ฅผ ํ์ธ ํ ์ด๋ฒคํธ์ ์๊ทธ๋์ ๋ค์ ๊บผ์ฃผ๊ณ ๋ฆฌํด ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์ค๋ ๋์ ๊ต์ฐฉ์ํ์ ๊ด๊ณ์์ด ์ปค๋๋จ์์ ์์ฑ๋ ์ด๋ฒคํธ ํ? ํ? ์๋ ๊ทธ๋ฅ ๋จ์ผ ์ด๋ฒคํธ? ์ ์ํ๋ค์ ์ปค๋์ด ํจ์๋ค(์์คํ ์ฝ)์ด ํธ์ถ๋ ๋๋ง๋ค ๋ฐ๊ฟ์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ๊ตญ ์ปค๋์ด ์์คํ ์ฝ์ ์์ฒญ ๋ฐ์์ ๋ ์ด๋ฒคํธ์ ์ํ๋ฅผ ๋ฐ๊ฟ์ฃผ๊ณ ๋ฟ๋ ค์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ์ธก๋ฉด์์ ์ด ์ฒ๋ฆฌ๊ฐ ์์์ ์ธ์ง ๋ฐ๋๋ฝ์ด ๊ฑธ๋ฆฌ๋์ง ํ์ธํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ์์คํ ์ฝ ๋๋ฌธ์ ์คํ๋ฝ ๊ฐ์ ๊ธฐ๋ฒ๋ณด๋ค ์ฒ๋ฆฌ๋ ๊น๋ํ์ง๋ง ๊ทธ๋งํผ ์ค๋ฒํค๋๋ฅผ ๋ ๋จน๋๊ฒ ์๋๊น? ์๊ฐ์ด ๋๋ค์.. (์ฑ๊ธ์ค๋ธ์ ํธ๊ฐ ์๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ํ๋์ ์ด๋ฒคํธ์ ๋ค์ค์ผ๋ก ๋ฑ๋กํ๊ฑฐ๋ ๋ฑ๋ฑ)
- 0
- 3
- 300




