์ฉ์ด ์ ๋ฆฌ
์ค๋ ๋(Thread)
์ฒ ํ์.
ํ๋ฆ์ ๋จ์. ๋์์ ํ๋ ๊ฒ.
๋ฉํฐ์ค๋ ๋(multithread)
์ฌ๋ฌ ๋ช ์ ์ฒ ํ์.
ํ๋ก์ธ์ค์ ๋ค๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉฐ, ๋์์ ์ฌ๋ฌ ๊ฐ์ง ๋์์ ํ ์ ์๋ ๊ฒ.
์ธ์ด์ ๋ฐ๋ผ ํน์ฑ์ ์ฐจ์ด๊ฐ ์์ง๋ง
์์ธก์ด ์ด๋ ค์์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
๋ฎคํ ์ค(Mutex)
ํฌํฌ.
ํ์ ๋์ด์๋ ๊ณต์ ์์์ ์ด๋ป๊ฒ ๋ฐฐ๋ถํด์ ์ฌ์ฉ์ ํ ๊ฒ์ธ์ง, ํ๋จํ๊ธฐ ์ํด์ ์ฌ์ฉ.
key๊ฐ์ ์ค์ ํ ๋น์ํค๋ ๋ฐฉ์.
๋จน๊ธฐ ์ํด์ ๋ฎคํ ์ค๊ฐ 2๊ฐ๊ฐ ํ์๋ก ํ๊ณ , ์์๋ฆฌ์ ์๋ ์ฌ๋์ด ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด
๋๋ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฎคํ ์ค๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ ์ฌ์ฉํด์ผ ํ๋ค.
์ฆ. ํฌํฌ (๋ฎคํ ์ค)๋ฅผ 2๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ๋ง ์ฒ ํ์๋ค์ ๋จน์ ์ ์๋ค. (์ค๋ ๋๊ฐ ๋์๋๋ค.)
์ธ๋งํฌ์ด(Semaphore)
๋ฎคํ ์ค์ ๋น์ทํ์ง๋ง ์ต๋ํ๋๋ก ๋์ํ๋ ๋ฐฉ์.
๊ตฌํ ์ ๋ฆฌ
๋ชจ๋ํฐ ์ค๋ ๋ (Thread)
์ฒ ํ์๋ค์ด ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์๋ ์ ์๋ค.
๊ทธ๋ด ๋ ์ฒ ํ์๋ค์ด ์ด์๋์ง ์ฃฝ์๋์ง ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํด์ฃผ๋ ๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ค์ผ ํ๋ค.
./philo 1 500 300 200
ํ์์ผ๋ก ๋ค์ด์จ ๊ฒฝ์ฐ ํฌํฌ๊ฐ 1๊ฐ๋ง ์์ผ๋ ์ฒ ํ์๋ ํฌํฌ๋ฅผ ์ก์ง ๋ชปํ์ฌ ๋ฌดํํ ๋๊ธฐํ๋ ์ํ๊ฐ ๋ฐ์๋๋ค.
์ด๋ด ๋ ํ์ฌ ์๊ฐ๊ณผ ์์กด์๊ฐ์ ๋น๊ตํ์ฌ ์ด์์๋์ง ์ฃฝ์๋์ง ํ๋ณ์ ํด์ค์ผ ํ๋ค.
ํ๋ณ ์์ฒด๋ ๊ฐ๋ฅํ์ง๋ง ์ง์ ํฌํฌ๊ฐ lock ์ํ๋ผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํฉ์ ๋ฐ๊ฒฌํ ์ ์์๋ค.
- ์์ ํฌํฌ๋ฅผ ์ง์ง ๋ชปํ๊ฒ ํ๋ค.
- ํฌํฌ์ ๋ํ ๊ฐ์ ์์ ๋ค๋ฅด๊ฒ ๋ฃ์ด๋ฒ๋ฆฐ๋ค.
๋ชจ๋ํฐ ์ค๋ ๋ 1
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ 1๊ฐ๋ง ์์ฑํด์
๋ชจ๋ํฐ ์ค๋ ๋ 1๊ฐ๊ฐ ๋ชจ๋ ์ฒ ํ์๋ค์ด ์ด์๋์ง ์ฃฝ์๋์ง ํ๋ณํ๋ ๋ฐฉ์.
๋ชจ๋ํฐ ์ค๋ ๋ n ( ์ฒ ํ์์ ์ )
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ ์ฒ ํ์์ ์๋งํผ ์์ฑ์ ํด์
์ฒ ํ์๋ง๋ค ๋ชจ๋ํฐ ์ค๋ ๋๊ฐ ๋๋ ๋ฐฉ์.
number_of_times_each_philospher_must_eat ๋ผ๋ ์ธ์๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ ์ต์ ํ์์ ์์ฌ๊ฐ
๋ณด์ฅ๋์ด์ผ ํ๋ฏ๋ก, ๋ชจ๋ ์ฒ ํ์๋ค์ด ์ต์ ํ์ ์ด์์ฉ ๋จน์๋์ง ํ์ธ์ ํด์ค์ผ ํ๊ณ ์ต์ ํ์์ ์์ฌ๋ฅผ ํด๋
๋ค๋ฅธ ์ฒ ํ์๊ฐ ์ต์๋งํผ ๋จน์ง ์์๋ค๋ฉด ๋จน๋ ๊ฒ์ ๋ฉ์ถฐ์๋ ์ ๋๋ค.
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ n ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ผ๋ก๋ง ๋ก์ง์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ์๋
๋ชจ๋ ์ฒ ํ์๋ค์ด ์ต์ ํ์๋งํผ ๋จน์๋์ง ํ์ธ์ ํด์ฃผ๋ ์ค๋ ๋๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์๋๋ค.
์ ์ฒด์ ์ผ๋ก ํ์ํ ๊ฒ๋ค๋ง ํ๋๋ก ๋๋๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐ์ด ๋ค์ด์
must_eat ํ์๋ฅผ ํ์ธํ๋ ์ค๋ ๋ 1๊ฐ.
๊ฐ๊ฐ์ ์ฒ ํ์๋ค์ด ์ฃฝ์๋์ง ์ด์๋์ง ํ์ธํ๋ ์ค๋ ๋. n๊ฐ
2 ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์ฌ์ฉ.
pthread_detach, pthread_join ์ฐจ์ด์
๊ณตํต์ : ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ์ฌ์ฉ๋ ์์์ ๋ํด์ ์ฆ์ free๋ฅผ ์งํํ๋ค.
์ฐจ์ด์ : join์ value_ptr์ผ๋ก ๊ฐ์ ์ถ๊ฐ๋ก ๋ฐ์์ฌ ์ ์๋ค. ( ์ค๋ ๋ ์๋ณ๋ฒํธ )
pthread_detach์ ๊ฒฝ์ฐ์๋ main์ด ๋๊น์ง ๋๋ฌํ์๋ค๋ฉด ๋ฐ๋ก ์์์ ๋ฐ๋ฉํ๊ณ ์ข
๋ฃํ์ง๋ง,
pthread_join์ ๊ฒฝ์ฐ์๋ main ๋์ค join์ ๊ฑธ๋ฆฌ๋ฉด ์ข
๋ฃ๋์ง ์๊ณ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋์ด ์์์ ๋ฐ๋ฉํ ๋๊น์ง
๊ธฐ๋ค๋ฆฐ๋ค.
์ค๋ ๋ ๋์ ์๋ฆฌ.
pthread_create์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค๋ ๋๋ ์์ฑ์ด ๋์ง๋ง ๊ทธ์ ๋์์ main๋ฌธ๋ ๋์์ ํ๊ณ ์์ด์
์ ํํ ํ์ธ์ด ์ด๋ ต๋ค.
main๋ฌธ์์ pthread_join ๋ฑ main๋ฌธ์ join์ ๊ฑฐ๋ ํ์์ผ๋ก ์ค๋ ๋๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์์ ์ ํด์ค์ผ ํ๋ค.
usleep ์ฌ์ฉ ์ด์ ..?
์๊ฑฐ๋ ๋จน์ ๋จน๋ ์๊ฐ์ ์ฆ ๊ฐํ๊ธฐ ์ํด์ ์ฌ์ฉ.
// ํ์ฌ ์๊ฐ ๊ณ์ฐ.
gettimeofday(&start, NULL);
usleep(2000);
gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
์ด๋ฐ ํ์์ผ๋ก ์ฐจ๊ฐ์ ๊ฐ์ง๊ณ ๊ณ์ฐ.
usleep ์๊ฐ ๋ฐ๋ฆผ ๋ฌธ์
while (!philo->info->die_or_life)
{
philo_forks(philo);
philo_eat(philo);
philo_unforks(philo);
philo_sleep(philo);
philo_think(philo);
}
return (NULL);
// usleep ์์ฒด์์ ๋ณด์ฅํด์ฃผ๋ ์๊ฐ์ ์ค์ฐจ๊ฐ ๋ง์ด ์๊ฒจ
// ์ถ๊ฐ์ ์ผ๋ก vsleep์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ.
void vsleep(unsigned int time)
{
unsigned int finish_time;
finish_time = time + now_time();
while (finish_time > (unsigned int)now_time())
{
usleep(100);
}
}
philo_loop ์์์ usleep์ ์ฌ์ฉํ๋ ๋ถ๋ถ (to_die, to_eat)์ ์ ์ธํ์ฌ๋
loop ๋ด๋ถ์์ ๋ก์ง์ด ๋์๊ฐ๋ฉด์ ์๊ฐ์ด ๊ณ์ ํ๋ฅด๊ธฐ๋ ํ๊ณ vsleep์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ์ ํด๋ ๋ด๋ถ์์๋ usleep์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก ์ฃฝ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ ์ฒ ํ์๊ฐ ์ฃฝ๊ฒ ๋ ์ ์๋ค.
๊ทธ๋์ ์ค๋ ๋์๋ ๋ก์ง์ด ์ ์ง๋๋๋ก ์๊ฐ์ ๋ณด์ ํด์ฃผ๋ ์์
์ด ํ์ํ๋ค.
revision_time = current - 100;
๋ง์ง๋ง ์์ฌ์๊ฐ = ํ์ฌ์๊ฐ - x ms
eat_time , sleep_time
eat์ ์งํํ์ฌ usleep์ ์ฌ์ฉํ์๋ค๋ฉด eat ๋ค์ ๋จ๊ณ์ธ sleep ํํธ์์
๋ง์ง๋ง ์์ฌ์๊ฐ์ ์๊ฐ์ ๋ณด์ ํด์ฃผ๋ ์์
์ ์งํํด์ค๋ค.
์ค๋ ๋์ ๋์๋ฐฉ๋ฒ
๋์์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ๋์ํ๋ ๋ฐฉ๋ฒ์ด ์๋ ๋น ๋ฅธ ์๋๋ก ๋์์ ํ์ฑํํด์ค์ ๋์ํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋์
๋ง์ philo์ ์๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ์๋ ์ปดํจํฐ ์์ฒด์์ ๋ฒํฐ์ง ๋ชปํ๊ณ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค.
void vsleep(unsigned int time)
{
unsigned int finish_time;
finish_time = time + now_time();
while (finish_time > (unsigned int)now_time())
{
usleep(n);
}
}
vsleep ํ์์ฒ๋ผ ์ฌ์ฉํ ๊ฒ์ usleep์ n ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ ํด์ค์ผ ํ๋ค.
๋ช ๋ช ์ ์ฒ ํ์๊ฐ ๋ค์ด์๋์ง์ ๋ฐ๋ผ ์ต์ ํ ์์ ์ ์งํํด์ฃผ๋ฉด ๋ง์ ์์ ์ฒ ํ์์ ์๊ฐ ๋ค์ด์๋ ์ ์ฃฝ์ ์ ์๋ค.
ํ์ธํด์ผ ํ๋ ๋ฐ๋ก ์ผ์ด์ค๋ค.
./philo 4 410 200 200
// ๋ฌดํ์ด ๋์์ผํ๋ค.
./philo 4 390 200 200 5
// ์ฃฝ์ด์ผํ๋ค.
// ( segfault check )
./philo 1 1000 300 200
// ์์กด ์๊ฐ์ด ์ง๋ ํ์ ์ฃฝ์ด์ผํ๋ค.
// ๋ฌดํ๋ฃจํ๊ฐ ๋๋์ง ํ์ธ.
./philo 1 1000 300 200 5
// ์์กด ์๊ฐ์ด ์ง๋ ํ์ ์ฃฝ์ด์ผํ๋ค.
// ๋ฌดํ๋ฃจํ๊ฐ ๋๋์ง ํ์ธ.
// ( segfault check )
// ์๋ฒฝ์ถ๊ตฌ =====================================
./philo 4 400 200 200
// ๋ฌดํ์ด ๋์์ผํ๋ค.
// ์๊ฐ์ด ๋ฑ ๋ง์ผ๋ฏ๋ก ์ฃฝ์ง์์์ผํ๋ค.
./philo 4 399 200 200
// ์ฃฝ์ด์ผํ๋ค.
// ( ํ์ง์ผ๋ก ํฌํฌ๋ฅผ ์ง์๋ ๋ฐ๋ก์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ์๋์ง ํ์ธ )
'42seoul > projects' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CPP Module] 00 (3) | 2021.09.15 |
---|---|
[C++] Orthodox Canonical Form (1) | 2021.09.14 |
[Philosophers] ์ฌ์ฉ ํจ์ ์ ๋ฆฌ (1) | 2021.09.03 |
[ft_services] ๋ช ๋ น์ด ์ ๋ฆฌ (2) | 2021.09.02 |
[ft_services] ๊ฐ๋ ์ ๋ฆฌ (1) | 2021.09.01 |
์ฉ์ด ์ ๋ฆฌ
์ค๋ ๋(Thread)
์ฒ ํ์.
ํ๋ฆ์ ๋จ์. ๋์์ ํ๋ ๊ฒ.
๋ฉํฐ์ค๋ ๋(multithread)
์ฌ๋ฌ ๋ช ์ ์ฒ ํ์.
ํ๋ก์ธ์ค์ ๋ค๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉฐ, ๋์์ ์ฌ๋ฌ ๊ฐ์ง ๋์์ ํ ์ ์๋ ๊ฒ.
์ธ์ด์ ๋ฐ๋ผ ํน์ฑ์ ์ฐจ์ด๊ฐ ์์ง๋ง
์์ธก์ด ์ด๋ ค์์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
๋ฎคํ ์ค(Mutex)
ํฌํฌ.
ํ์ ๋์ด์๋ ๊ณต์ ์์์ ์ด๋ป๊ฒ ๋ฐฐ๋ถํด์ ์ฌ์ฉ์ ํ ๊ฒ์ธ์ง, ํ๋จํ๊ธฐ ์ํด์ ์ฌ์ฉ.
key๊ฐ์ ์ค์ ํ ๋น์ํค๋ ๋ฐฉ์.
๋จน๊ธฐ ์ํด์ ๋ฎคํ ์ค๊ฐ 2๊ฐ๊ฐ ํ์๋ก ํ๊ณ , ์์๋ฆฌ์ ์๋ ์ฌ๋์ด ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด
๋๋ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฎคํ ์ค๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ ์ฌ์ฉํด์ผ ํ๋ค.
์ฆ. ํฌํฌ (๋ฎคํ ์ค)๋ฅผ 2๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ๋ง ์ฒ ํ์๋ค์ ๋จน์ ์ ์๋ค. (์ค๋ ๋๊ฐ ๋์๋๋ค.)
์ธ๋งํฌ์ด(Semaphore)
๋ฎคํ ์ค์ ๋น์ทํ์ง๋ง ์ต๋ํ๋๋ก ๋์ํ๋ ๋ฐฉ์.
๊ตฌํ ์ ๋ฆฌ
๋ชจ๋ํฐ ์ค๋ ๋ (Thread)
์ฒ ํ์๋ค์ด ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์๋ ์ ์๋ค.
๊ทธ๋ด ๋ ์ฒ ํ์๋ค์ด ์ด์๋์ง ์ฃฝ์๋์ง ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํด์ฃผ๋ ๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ค์ผ ํ๋ค.
./philo 1 500 300 200
ํ์์ผ๋ก ๋ค์ด์จ ๊ฒฝ์ฐ ํฌํฌ๊ฐ 1๊ฐ๋ง ์์ผ๋ ์ฒ ํ์๋ ํฌํฌ๋ฅผ ์ก์ง ๋ชปํ์ฌ ๋ฌดํํ ๋๊ธฐํ๋ ์ํ๊ฐ ๋ฐ์๋๋ค.
์ด๋ด ๋ ํ์ฌ ์๊ฐ๊ณผ ์์กด์๊ฐ์ ๋น๊ตํ์ฌ ์ด์์๋์ง ์ฃฝ์๋์ง ํ๋ณ์ ํด์ค์ผ ํ๋ค.
ํ๋ณ ์์ฒด๋ ๊ฐ๋ฅํ์ง๋ง ์ง์ ํฌํฌ๊ฐ lock ์ํ๋ผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํฉ์ ๋ฐ๊ฒฌํ ์ ์์๋ค.
- ์์ ํฌํฌ๋ฅผ ์ง์ง ๋ชปํ๊ฒ ํ๋ค.
- ํฌํฌ์ ๋ํ ๊ฐ์ ์์ ๋ค๋ฅด๊ฒ ๋ฃ์ด๋ฒ๋ฆฐ๋ค.
๋ชจ๋ํฐ ์ค๋ ๋ 1
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ 1๊ฐ๋ง ์์ฑํด์
๋ชจ๋ํฐ ์ค๋ ๋ 1๊ฐ๊ฐ ๋ชจ๋ ์ฒ ํ์๋ค์ด ์ด์๋์ง ์ฃฝ์๋์ง ํ๋ณํ๋ ๋ฐฉ์.
๋ชจ๋ํฐ ์ค๋ ๋ n ( ์ฒ ํ์์ ์ )
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ ์ฒ ํ์์ ์๋งํผ ์์ฑ์ ํด์
์ฒ ํ์๋ง๋ค ๋ชจ๋ํฐ ์ค๋ ๋๊ฐ ๋๋ ๋ฐฉ์.
number_of_times_each_philospher_must_eat ๋ผ๋ ์ธ์๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ ์ต์ ํ์์ ์์ฌ๊ฐ
๋ณด์ฅ๋์ด์ผ ํ๋ฏ๋ก, ๋ชจ๋ ์ฒ ํ์๋ค์ด ์ต์ ํ์ ์ด์์ฉ ๋จน์๋์ง ํ์ธ์ ํด์ค์ผ ํ๊ณ ์ต์ ํ์์ ์์ฌ๋ฅผ ํด๋
๋ค๋ฅธ ์ฒ ํ์๊ฐ ์ต์๋งํผ ๋จน์ง ์์๋ค๋ฉด ๋จน๋ ๊ฒ์ ๋ฉ์ถฐ์๋ ์ ๋๋ค.
๋ชจ๋ํฐ ์ค๋ ๋๋ฅผ n ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ผ๋ก๋ง ๋ก์ง์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ์๋
๋ชจ๋ ์ฒ ํ์๋ค์ด ์ต์ ํ์๋งํผ ๋จน์๋์ง ํ์ธ์ ํด์ฃผ๋ ์ค๋ ๋๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์๋๋ค.
์ ์ฒด์ ์ผ๋ก ํ์ํ ๊ฒ๋ค๋ง ํ๋๋ก ๋๋๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐ์ด ๋ค์ด์
must_eat ํ์๋ฅผ ํ์ธํ๋ ์ค๋ ๋ 1๊ฐ.
๊ฐ๊ฐ์ ์ฒ ํ์๋ค์ด ์ฃฝ์๋์ง ์ด์๋์ง ํ์ธํ๋ ์ค๋ ๋. n๊ฐ
2 ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์ฌ์ฉ.
pthread_detach, pthread_join ์ฐจ์ด์
๊ณตํต์ : ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ์ฌ์ฉ๋ ์์์ ๋ํด์ ์ฆ์ free๋ฅผ ์งํํ๋ค.
์ฐจ์ด์ : join์ value_ptr์ผ๋ก ๊ฐ์ ์ถ๊ฐ๋ก ๋ฐ์์ฌ ์ ์๋ค. ( ์ค๋ ๋ ์๋ณ๋ฒํธ )
pthread_detach์ ๊ฒฝ์ฐ์๋ main์ด ๋๊น์ง ๋๋ฌํ์๋ค๋ฉด ๋ฐ๋ก ์์์ ๋ฐ๋ฉํ๊ณ ์ข
๋ฃํ์ง๋ง,
pthread_join์ ๊ฒฝ์ฐ์๋ main ๋์ค join์ ๊ฑธ๋ฆฌ๋ฉด ์ข
๋ฃ๋์ง ์๊ณ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋์ด ์์์ ๋ฐ๋ฉํ ๋๊น์ง
๊ธฐ๋ค๋ฆฐ๋ค.
์ค๋ ๋ ๋์ ์๋ฆฌ.
pthread_create์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค๋ ๋๋ ์์ฑ์ด ๋์ง๋ง ๊ทธ์ ๋์์ main๋ฌธ๋ ๋์์ ํ๊ณ ์์ด์
์ ํํ ํ์ธ์ด ์ด๋ ต๋ค.
main๋ฌธ์์ pthread_join ๋ฑ main๋ฌธ์ join์ ๊ฑฐ๋ ํ์์ผ๋ก ์ค๋ ๋๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์์ ์ ํด์ค์ผ ํ๋ค.
usleep ์ฌ์ฉ ์ด์ ..?
์๊ฑฐ๋ ๋จน์ ๋จน๋ ์๊ฐ์ ์ฆ ๊ฐํ๊ธฐ ์ํด์ ์ฌ์ฉ.
// ํ์ฌ ์๊ฐ ๊ณ์ฐ.
gettimeofday(&start, NULL);
usleep(2000);
gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
์ด๋ฐ ํ์์ผ๋ก ์ฐจ๊ฐ์ ๊ฐ์ง๊ณ ๊ณ์ฐ.
usleep ์๊ฐ ๋ฐ๋ฆผ ๋ฌธ์
while (!philo->info->die_or_life)
{
philo_forks(philo);
philo_eat(philo);
philo_unforks(philo);
philo_sleep(philo);
philo_think(philo);
}
return (NULL);
// usleep ์์ฒด์์ ๋ณด์ฅํด์ฃผ๋ ์๊ฐ์ ์ค์ฐจ๊ฐ ๋ง์ด ์๊ฒจ
// ์ถ๊ฐ์ ์ผ๋ก vsleep์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ.
void vsleep(unsigned int time)
{
unsigned int finish_time;
finish_time = time + now_time();
while (finish_time > (unsigned int)now_time())
{
usleep(100);
}
}
philo_loop ์์์ usleep์ ์ฌ์ฉํ๋ ๋ถ๋ถ (to_die, to_eat)์ ์ ์ธํ์ฌ๋
loop ๋ด๋ถ์์ ๋ก์ง์ด ๋์๊ฐ๋ฉด์ ์๊ฐ์ด ๊ณ์ ํ๋ฅด๊ธฐ๋ ํ๊ณ vsleep์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ์ ํด๋ ๋ด๋ถ์์๋ usleep์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก ์ฃฝ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ ์ฒ ํ์๊ฐ ์ฃฝ๊ฒ ๋ ์ ์๋ค.
๊ทธ๋์ ์ค๋ ๋์๋ ๋ก์ง์ด ์ ์ง๋๋๋ก ์๊ฐ์ ๋ณด์ ํด์ฃผ๋ ์์
์ด ํ์ํ๋ค.
revision_time = current - 100;
๋ง์ง๋ง ์์ฌ์๊ฐ = ํ์ฌ์๊ฐ - x ms
eat_time , sleep_time
eat์ ์งํํ์ฌ usleep์ ์ฌ์ฉํ์๋ค๋ฉด eat ๋ค์ ๋จ๊ณ์ธ sleep ํํธ์์
๋ง์ง๋ง ์์ฌ์๊ฐ์ ์๊ฐ์ ๋ณด์ ํด์ฃผ๋ ์์
์ ์งํํด์ค๋ค.
์ค๋ ๋์ ๋์๋ฐฉ๋ฒ
๋์์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ๋์ํ๋ ๋ฐฉ๋ฒ์ด ์๋ ๋น ๋ฅธ ์๋๋ก ๋์์ ํ์ฑํํด์ค์ ๋์ํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋์
๋ง์ philo์ ์๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ์๋ ์ปดํจํฐ ์์ฒด์์ ๋ฒํฐ์ง ๋ชปํ๊ณ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค.
void vsleep(unsigned int time)
{
unsigned int finish_time;
finish_time = time + now_time();
while (finish_time > (unsigned int)now_time())
{
usleep(n);
}
}
vsleep ํ์์ฒ๋ผ ์ฌ์ฉํ ๊ฒ์ usleep์ n ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ ํด์ค์ผ ํ๋ค.
๋ช ๋ช ์ ์ฒ ํ์๊ฐ ๋ค์ด์๋์ง์ ๋ฐ๋ผ ์ต์ ํ ์์ ์ ์งํํด์ฃผ๋ฉด ๋ง์ ์์ ์ฒ ํ์์ ์๊ฐ ๋ค์ด์๋ ์ ์ฃฝ์ ์ ์๋ค.
ํ์ธํด์ผ ํ๋ ๋ฐ๋ก ์ผ์ด์ค๋ค.
./philo 4 410 200 200
// ๋ฌดํ์ด ๋์์ผํ๋ค.
./philo 4 390 200 200 5
// ์ฃฝ์ด์ผํ๋ค.
// ( segfault check )
./philo 1 1000 300 200
// ์์กด ์๊ฐ์ด ์ง๋ ํ์ ์ฃฝ์ด์ผํ๋ค.
// ๋ฌดํ๋ฃจํ๊ฐ ๋๋์ง ํ์ธ.
./philo 1 1000 300 200 5
// ์์กด ์๊ฐ์ด ์ง๋ ํ์ ์ฃฝ์ด์ผํ๋ค.
// ๋ฌดํ๋ฃจํ๊ฐ ๋๋์ง ํ์ธ.
// ( segfault check )
// ์๋ฒฝ์ถ๊ตฌ =====================================
./philo 4 400 200 200
// ๋ฌดํ์ด ๋์์ผํ๋ค.
// ์๊ฐ์ด ๋ฑ ๋ง์ผ๋ฏ๋ก ์ฃฝ์ง์์์ผํ๋ค.
./philo 4 399 200 200
// ์ฃฝ์ด์ผํ๋ค.
// ( ํ์ง์ผ๋ก ํฌํฌ๋ฅผ ์ง์๋ ๋ฐ๋ก์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ์๋์ง ํ์ธ )
'42seoul > projects' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CPP Module] 00 (3) | 2021.09.15 |
---|---|
[C++] Orthodox Canonical Form (1) | 2021.09.14 |
[Philosophers] ์ฌ์ฉ ํจ์ ์ ๋ฆฌ (1) | 2021.09.03 |
[ft_services] ๋ช ๋ น์ด ์ ๋ฆฌ (2) | 2021.09.02 |
[ft_services] ๊ฐ๋ ์ ๋ฆฌ (1) | 2021.09.01 |