Thread Libraries
ํ๋๋ Kernel Scheduler ๋ค๋ฅธ ํ๋๋ Kernel์ด ์ฐ๋ ๋๋ฅผ ์ ๊ณต์ํด๋ User Level์์ ์ ๊ณตํ๋ User level library๊ฐ ์กด์ฌํ๋ค. POSIX Pthreads๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๊ฐ ์๋๋ผ ์ด๋ ํ ํจ์๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๊ณ ๊ธฐ๋กํ ๋ช ์ธ์ ๋๋์ด๋ค. LinuxThreads, NPTL ์ฐ๋ ๋ ๋ฑ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
POSIX PThreads
์ด๋ค ํจ์๋ฅผ ์จ์ผ ํ๋๊ฐ? ์ ์ผ ์ค์ํ ํจ์๋ pthread_create ์ด๋ค. ์ฐ๋ ๋๋ฅผ ๋ง๋ค์ด๋ธ๋ค. ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๊ฐ ์ ์ผ ์ค์ํ๋ค. function pointer์ด๋ค. C์ธ์ด์์ ์ ๋ณด์ง ๋ชปํ๋ ๋ฌธ๋ฒ์ฒ๋ผ ๋๊ปด์ง ๊ฒ์ด๋ค. ํจ์๋ ํน์ ํ ์์น๋ก ๋ฐ์ด๋๋ ๊ฒ์ ์๋ฏธํ๋ค. ํจ์์ ์ด๋ฆ์ ์ฃผ์๋ผ๋ ๊ฒ์ ๋ค์ ๊ธฐ์ตํด์ผ ํ๋ค. %p๋ก ์ถ๋ ฅํ๋ฉด ์ฃผ์๊ฐ์ด ๋์ค๊ณ ๊ทธ ๊ณณ์ ์ ์ฅํ๋ ํฌ์ธํฐ ํ์ ์ด function pointer๋ผ๊ณ ๋ถ๋ฅธ๋ค. start_routine ์์ ๋ณ์ด ํ๋ ์๊ณ ์์๋ void *๊ฐ ์๊ณ ๋ค์๋ void *๊ฐ ์๋ค. return type๊ณผ ํ๋ผ๋ฏธํฐ๋ void * ๊ฐ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ void *๋ฅผ ์ฌ์ฉํ๋๊ฐ? ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ํ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์กด์ฌํ๋๋ฐ ์ด๋ฅผ ๋ค์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ํธ๋ฆฌํ ๋ฐ์ดํฐ ํ์ ์ด void * ์ด ๋๋ค Struct ๋ณ์์ ๋ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค ์ฑ์์ ์ํ๋ ํ์ ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ void *๋ก ๊ด๋ฆฌํ๊ธฐ ํธํ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
์ ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์๋ก์ด ์ฐ๋ ๋์ ์์ ์ฃผ์๊ฐ์ด ๋๋ค.
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ฑ์์ ์ค ํ์๊ฐ ์๋ค. ์๋ก ๋ง๋ค์ด์ ธ ์ฑ์์ ธ์ผ ํ Thread์ ID๊ฐ ๋์ค์ ํ ๋น๋๋ค. ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด์ Kernel, User๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง, ๊ต์ฅํ ๋ค์ํ ์ต์ ๋ค์ ์ ์ํ๊ธฐ ์ํ Structure๊ฐ ๋๋ค.
wait function์ ์ฐ๋ ๋ ๋ฒ์ ์ด join ํจ์์ด๋ค. ๋ด๊ฐ ์ด๋ค ์ฐ๋๋๋ฅผ ๊ธฐ๋ค๋ฆด์ง ์ง์ ํ ์ ์๋๋ฐ ๊ทธ๊ฒ์ด ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ํด๋นํ๋ค. ์ด ์ฐ๋ ๋ ์์ด๋๋ Create ํจ์์์ ์์๋ผ ์ ์๋ค. ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ฐ๋ ๋๋ฅผ ์ข ๋ฃํ๊ณ ๋์ report value๋ฅผ ๋ฐ์๋ผ ์ ์๋ค. ๋ฆฌํดํ๊ณ ์ถ์ ๋ฐ์ดํฐ ํ์ ์ ํฌ์ธํฐ๋ฅผ ๋ฐ์์์ผ ํ๋๋ฐ ์ด๋ฏธ void * ์ด๊ธฐ ๋๋ฌธ์ ์ด์ค ํฌ์ธํฐ ํ์ ์ผ๋ก ๋ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค. exit ํจ์๋ ํ์ฌ ์ฐ๋ ๋๋ฅผ ์ข ๋ฃ์ํค๋ functioin์ด๋ค. ๊ทธ๋ฅ exitํ๊ณ ์ด๋ค ์ ์ด ๋ค๋ฅผ๊น? pthread_exit์ ์ฐ๋๋ ํ๋๋ฅผ ์ข ๋ฃ์ํค๋ ํจ์์ด๊ณ ๊ทธ๋ฅ exit์ ํด๋น ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํค๋ ํจ์์ด๋ค.
Example
sum์ ์ ์ญ ๋ณ์์ด๊ณ ๋ชจ๋ ์ฐ๋ ๋์์ ๊ณต์ ํ๊ธฐ ์ํจ์ด๋ค. runner๋ผ๋ ํ๋กํ ํ์ ์ด void *์ด๊ณ ์ด ํจ์๊ฐ ์ฐ๋ ๋์ ์์์ ์ ๋ฐ์์ค ํจ์๊ฐ ๋๋ค. ์ฒ์ atoiํจ์๋ฅผ ํตํด์ string์ Integer๋ก ๋ณํ์ ํด์ฃผ๊ฒ ๋๋ค. 1๋ถํฐ upper๊น์ง ๋ค ๋ํ๊ฒ ๋๋ ๊ณผ์ ์ ์งํํ๋ค. pthread_exit์ ํ๊ฒ ๋๋๋ฐ return NULL์ ํด๋ ๋ ๊ฒ ๊ฐ๋ค. pthread_t_tid๋ TID๋ฅผ ๋ฐ๊ธฐ ์ํ ๋ณ์. pthread_join์ ๋ฃ์ง ์์ผ๋ฉด sum ์ด ๊ณ์ฐ๋๊ธฐ ์ ์ ์ถ๋ ฅ๋ ํ๋ฅ ์ด ๋์์ง๋ค.
Windows Threads
CreateThread Structure์์ ipStartAddress๊ฐ ์๋๋ฐ ์๋ก ์๊ธฐ๊ฒ ๋๋ Thread์ ์์ ์ฃผ์๋ฅผ ์ ์ฅํ ์ ์๋ค. ipParamter๋ LpStartAddress์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ์ด ๋๊ณ LpThreadID๋ ๋ง๋ค์ด์ง TID๊ฐ ์ ์ฅ๋๋ ๋ณ์์ด๋ค. WaitForSingleObject..? ์ฐ๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆด๋์ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆด ๋๋ ์ฌ์ฉ์ ํ๋ค.
CloseHandle๋ Thread Exit์ ํ ๋ ์ฌ์ฉ์ด ๋๋ค. ์ด ํจ์..! ์ค์ํ๋ค. ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ํ ๋น๋ ์์์ด ์ด๋๊ฐ์ ๋จ์์๊ฒ ๋๋ค. Thread๊ฐ ๋๋ฌ๋ค๊ณ ํ๋๋ผ๋ CloseHandle์ ๊ผญ ํด์ค์ผ ํ๋ค. CreateThread๋ฅผ ๋ง๋ค ๋๋ง๋ค ColseHandle์ ์จ๋๊ณ ์์์ ํด์ผ ํ๋ค. (๊ผญ ๊ธฐ์ตํ ๊ฒ!!!!!!!!!)
Windows Multithreaded C Program
Window์์ Thread๋ฅผ ๋ง๋๋ ๊ณผ์
Java Thread
Thread Class๋ฅผ ์์๋ฐ๋๋ค. ๊ฐ๋จํ์ง๋ง ๋จ์ ์ด ํ๋ ์กด์ฌํ๋ค. Child๋ ๋ฑ ํ๋์ Parent๋ง ๊ฐ์ ธ์ผ ํ๊ณ ๊ทธ๋ ์ ํ์ ์ธ ์ฌํญ์ด ์กด์ฌํ ์ ์๊ฒ ๋๋ค. ๋ค๋ฅธ ๋ฐฉ์์ Runnable Interface๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๋ค. Public Interface Runnable์ Body๊ฐ ์์ ๋ abstract์ด๊ณ ์ด๋ฅผ ์์๋ฐ๋ ํจ์๊ฐ ์ด๋ฅผ ๊ตฌํํ๊ฒ ๋๋ค.
Java Thread using Thread Class
Thread๋ฅผ ์์๋ฐ๊ณ run์ด๋ผ๋ ํจ์๋ฅผ Overloadํ๊ฒ ๋๋ค. PrimeThread๋ฅผ new ๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ p.start()๋ฅผ ํ๊ฒ ๋๋ฉด run ๋ฉ์๋๋ถํฐ ์์ํ๊ฒ ๋๋ค. p.start()๋ฅผ ํ๋ฉด ์๋ก์ด Thread๋ฅผ ์ฌ์ฉํ๊ณ run()์ ํ๋ฉด ๊ธฐ์กด์ Thread๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋๋ค. run์ ํ๋ฉด ๊ธฐ์กด์ single Thread๋ฅผ ๊ทธ๋๋ ์ ์งํ๊ฒ ๋๋ค.
Java Thread using Running Interface
PrimeRun์ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๊ณ new Thread(p)๋ฅผ ๋ง๋ค๊ณ start๋ฅผ ํด์ค์ผ ํ๋ค. implements Runnable์ ํ์๋ ์ข์ ์ ์ PrimeRun์ด ๋ค๋ฅธ Parent CLass๋ฅผ ์์๋ฐ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
Java Multithreaded Program
Java Multithreaded Program
new Thread(new Summation(())๋ก Thread๋ฅผ ๋ง๋ค๊ณ start()๋ฅผ ํ๊ฒ ๋๋ค. ์ด๋ฐ์์ผ๋ก Thread๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
HW4
2๋ฒ
child์์ 4๊ฐ๋ง ๋๋ฆฌ์ง ๋ง๊ณ ๋น String์ ๋ง๋๋ฉด LOOP๋ฅผ ํ์ถํ๋๋ก ๊ตฌํํด๋ผ
๊ทธ๋ฆฌ๊ณ unlink๋ฅผ ํด์ ํด์ ํ๊ฒ ๋๋ค.
3๋ฒ
3๋ฒ์งธ์ ๊ฐ์ ๋ฃ๋ ์๊ฐ๋ถํฐ ์ฒซ ๋ฒ์งธ ๋ฃ์๋ ๊ฐ๋ค์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
4๋ฒ์งธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด 2 ๋ฒ์งธ์ ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ด๋ฐ์์ผ๋ก 2์นธ ์ฐจ์ด๋ฅผ ์ฃผ๋ฉด์ ์ถ๋ ฅ์ ํ๊ฒ ํ๋ค.
User๊ฐ ESC(27๋ฒ)๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด Producer Terminate๋ฅผ ํ๊ณ ๋จ์์๋ 2๊ฐ์ Key๋ฅผ ๋ง์ ๋ฝ์์ ์ถ๋ ฅํด์ฃผ๊ฒ ๋๋ค.
Shared Memory๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ปดํ์ผ ์ -lrt๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
๊ทธ์์ ์๋ ๊ฐ๋ค์ด 3๊ฐ ์๋์ธ ๊ฒฝ์ฐ ๊ธฐ๋ค๋ ค๋ผ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ๋ฃ๊ฒ ๋๋ค. getCount๋ฅผ ํตํด์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค. out = out + 1์ ๋ฐฉ๋ฒ์ ๋ณ๋์ ํจ์๋ก ๊ตฌํ์ ํ ๊ฒ์ด๋ค. wait์ ์๋ฏธ๋ ํจ์๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ผ๋ ๊ฒ์ด ์๋๋ผ while๋ก ๊ตฌํํ๋ผ๋ ์๋ฏธ.
KeyBuffer ๊ตฌํ
GetKeyCount๋ in out์ ํตํด์ ํ์ฌ ๋ช ๊ฐ์ key ๊ฐ ์๋์ง๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค. ๋ช ๊ฐ์ ์์ธ์ฒ๋ฆฌ ํ์
ํ ๋์ค์ด๋ฉด ๋ค ๋๋๋ ํจ์๋ค
Consumer์์ wait์ while loop ์ฌ์ฉ