본문내용
성공했을 경우에 작업를 실행한다. 탐색 부분은 무한 루프이지만, Linux Kernel의 스케줄링으로 여러 Thread가 실행될 수 있다.
3.2 소스 코드 - philosopher()부분만 기재
int g_index=0;
void *philosopher(void *arg)
{
int left,right;
int id=g_id++;
int spa=0, loop=1;
while(loop)
{
left=right=0;
while(pthread_mutex_trylock(mutexChopstick+g_index))
g_index=(++g_index)%5;
left=g_index++;
while(pthread_mutex_trylock(mutexChopstick+g_index))
g_index=(++g_index)%5;
right=g_index++;
spa++;
printf("philosopher %d eat spaghetti %d times\n",id,spa);
if(spa==5)
{
printf("philosopher %d is full!\n",id);
loop=0;
}
pthread_mutex_unlock(mutexChopstick+left);
pthread_mutex_unlock(mutexChopstick+right);
sched_yield();
}
pthread_exit(NULL);
}
2.4 결과 분석
역시 같은 결과가 나온다. 자원을 순차적으로 할당하기 때문에 지금 요청한 자원이 비어 있다면, 그 다음도 비어있을 수 있고, 만약 비어있지 않다고 하더라고 빌 때까지 순환을 하여 사용할 수 있게 된다.
3.2 소스 코드 - philosopher()부분만 기재
int g_index=0;
void *philosopher(void *arg)
{
int left,right;
int id=g_id++;
int spa=0, loop=1;
while(loop)
{
left=right=0;
while(pthread_mutex_trylock(mutexChopstick+g_index))
g_index=(++g_index)%5;
left=g_index++;
while(pthread_mutex_trylock(mutexChopstick+g_index))
g_index=(++g_index)%5;
right=g_index++;
spa++;
printf("philosopher %d eat spaghetti %d times\n",id,spa);
if(spa==5)
{
printf("philosopher %d is full!\n",id);
loop=0;
}
pthread_mutex_unlock(mutexChopstick+left);
pthread_mutex_unlock(mutexChopstick+right);
sched_yield();
}
pthread_exit(NULL);
}
2.4 결과 분석
역시 같은 결과가 나온다. 자원을 순차적으로 할당하기 때문에 지금 요청한 자원이 비어 있다면, 그 다음도 비어있을 수 있고, 만약 비어있지 않다고 하더라고 빌 때까지 순환을 하여 사용할 수 있게 된다.