๊ถ๊ธํ ์ ์ด ์์ต๋๋ค.
๋ถ์ํด ๋ณด์์ ๋ ์ฐ๋ คํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ค๋ฉด ๊ฝค ๊น๋ค๋ก์ด ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.๋ฌธ์ ์ํฉ 1(๋ณด๋ผ SendBuffer๊ฐ ์๋๋ฐ WSASend()๋ฅผ ํธ์ถ)1. Send๊ฐ ๊ฑธ๋ฆฐ ์ํฉ2. Thread A : Lock์ ๊ฑธ์ด sendQueue์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ Lock์ ํ(Send).3. Thread B : ์๋ฃ ๋ฃจํด์ ์ํด ๊นจ์ด๋ sendQueue์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๊ณ RegisterSend ํธ์ถ(ProcessSend).4. Thread B : sendQueue์ ์์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ก(RegisterSend).5. Thread C : ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ์๋ฃ ๋ฃจํด์ผ๋ก ๋ฐ๊ณ sendRegistered ํ๋๊ทธ๋ฅผ ํ(ProcessSend).6. Thread A : ์ด์ด์ sendRegistered ํ๋๊ทธ๋ฅผ ํ์ธํ๊ณ RegisterSend ํธ์ถ(Send).7. Thread A : sendQueue๋ฅผ ํ์ธํ์ผ๋ SendBuffer๊ฐ ์๋ ์ํฉ์ด ๋ฐ์(RegisterSend).8. Thread A : ๋ณด๋ผ SendBuffer๊ฐ ์๋๋ฐ ์ ์ก์ ์๋ํ๋ WSAEINVAL(์๋ชป๋ ์ธ์) ์๋ฌ๊ฐ ๋จ๊ณ ์คํจํจ(RegisterSend). ์ด ๋ฌธ์ ์ํฉ 1์ ๋ ๊น๊ฒ ํ๊ณ ๋ค๋ฉด ๋ค์์ ์ฐ์ฅ์ ์ ์์นํ ๋ฌธ์ ๋ฅผ ํ์
ํ ์ ์์ต๋๋ค.๋ฌธ์ ์ํฉ 2(๋ฐ์ดํฐ๋ฅผ ๋ฃ์๋๋ฐ ๋ณด๋ด์ง ์๋ ์ํฉ)1. Send๊ฐ ๊ฑธ๋ฆฐ ์ํฉ2. Thread A : Lock์ ๊ฑธ์ด sendQueue์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ Lock์ ํ(Send).3. Thread B : ์๋ฃ ๋ฃจํด์ ์ํด ๊นจ์ด๋ sendQueue์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๊ณ RegisterSend ํธ์ถ(ProcessSend).4. Thread B : sendQueue์ ์์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ก(RegisterSend).5. Thread C : ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ์๋ฃ ๋ฃจํด์ผ๋ก ๋ฐ๊ณ sendRegistered ํ๋๊ทธ๋ฅผ ํ(ProcessSend).6. Thread A : ์ด์ด์ sendRegistered ํ๋๊ทธ๋ฅผ ํ์ธํ๊ณ RegisterSend ํธ์ถ(Send).7. Thread A : sendQueue๋ฅผ ํ์ธํ์ผ๋ SendBuffer๊ฐ ์๋ ์ํฉ์ด ๋ฐ์(RegisterSend).8. Thread A : ๋ณด๋ผ SendBuffer๊ฐ ์๋๋ฐ ์ ์ก์ ์๋ํ๋ ์๋ฌ๊ฐ ๋จ๊ณ ์คํจํจ(RegisterSend).int32 errCode = ::WSAGetLastError(); if (WSA_IO_PENDING != errCode) { HandleError(errCode); _sendEvent.owner = nullptr; _sendEvent.sendBuffers.clear(); // 9. Thread D : Lock์ ๊ฑธ์ด sendQueue์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ Lock์ ํ(Send).10. Thread D : sendRegistered ํ๋๊ทธ๋ฅผ ํ์ธํ๋๋ฐ ๋๊ตฐ๊ฐ ์ ์ ์ค์ธ ์ํ์ด๋ RegisterSend๋ฅผ ํธ์ถํ์ง ์์(Send).11. Thread A : sendRegistered ํ๋๊ทธ๋ฅผ false๋ก ๋ฐ๊ฟ(RegisterSend).12. Thread D์์ ๋ฃ์ SendBuffer๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชป ํ๋ ์ํฉ์ด ๋ฐ์.์ ํํ ๋งํด์ 7๋ฒ ๊ณผ์ ์์ sendQueue์ ์๋ ๋ด์ฉ์ ์ ๋ถ ๋นผ์ค๊ณ Lock์ ํธ๋ ๊ทธ ์์ ๋ถํฐ WSASend() ํธ์ถ ํ ์๋ฌ๊ฐ ๋ฐ์ํด sendRegistered๋ฅผ false๋ก ๋ฐ๊พธ๊ธฐ ์ด์ ์ ๋ชจ๋ ๊ตฌ๊ฐ์์ ๋ฌธ์ ์ํฉ 2๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.์ ์ด์ WRITE_LOCK์ ๊ฑธ๊ณ sendQueue์ ๋ณํ๋ฅผ ์ฃผ๋ ๋ก์ง๊ณผ sendRegistered์ ์ํ๋ฅผ ์ ์ดํ๋ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด์ ์๊ธฐ๋ ๋ฌธ์ ์ด๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ด Lock์ ๊ฑด๋ค๊ณ ํด์ ํด๊ฒฐ๋์ง ์์ต๋๋ค.sendQueue๋ ์ด๋ฏธ ๋ณํ๋์๊ณ ์ด๋ฅผ ํ์งํ์ง ๋ชป ํ๊ธฐ์ ๋ฐ์ํ ๋ฌธ์ ์ด๋๊น์.int32 errCode = ::WSAGetLastError(); if (WSA_IO_PENDING != errCode) { HandleError(errCode); _sendEvent.owner = nullptr; _sendEvent.sendBuffers.clear(); WRITE_LOCK; _sendRegistered.store(false); }ProcessSend()์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ํตํด Send() -> RegisterSend()๋ฅผ ํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋๋ค.๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์์ ๋ฌธ์ ์ํฉ 1์ด ๋จผ์ ์ ํ๋์ด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ด์ผ ํฉ๋๋ค.