-
[Philosophers] 필로소퍼 70시간만에 끝내기(2)-첫번째 문제 파악하기42seoul 2021. 5. 21. 16:29
첫번째 문제 풀기: philo_one
program name: philo_one
turn in files: philo_one/(폴더에 넣으라는 뜻)
makefile: 만들어라
arguments: 철학자의 수, 죽는 시간, 먹는 시간, 자는 시간, [각 철학자가 먹어야하는 횟수(선택적)]
non common rules
- 각 철학자 사이에 포크가 하나 있음. 그러므로 왼쪽에 하나 오른쪽에 하나씩 있음.
- 포크를 겹치게 하는 것을 방지하기 위해, 각각을 뮤텍스로 그 상태를 보호해야 함.
- 각 철학자는 thread임
- thread가 뭔지 먼저 찾아보기
사용함수 목록
- memset
- printf
- malloc
- free
- write
- usleep
- 마이크로초 동안 대기
- unistd.h
- 사용방법 예시: usleep(1000 * 1000);
-
#include <unistd.h> int main(void) { while (1) { write(1, "Mississippi\n", 12); usleep(1000 * 1000); } }
- 현재 시간을 가져오고 시스템의 시간값을 설정한다.
- sys/time.h
- time과의 차이: 마이크로초 단위까지 알려줌. -> 따라서 gettimeofday의 사용이 권장됨
- 인자: 구조체 두개
- 첫번째 인자: tv -> 현재 시스템 시간을 저장하기 위한 구조체(tv_sec, tv_usec) -> 초와 마이크로초를 가지고 있음
- 두번째 인자: 현재 사용되지 않고 있음. 앞으로도 지원되지 않을 것임. null을 써주면 됨.
- return: 성공시 0을, 실패시 -1을 리턴
- 만약 시스템의 시간을 수정하고 싶으면 get으로 받은 구조체를 수정해서 settimeofday로 set하면 됨.(과제에서는 set은 필요없음)
-
#include <sys/time.h> #include <stdio.h> int main() { struct timeval time_info; gettimeofday(&time_info, NULL); printf("time is %ld seconds\n", time_info.tv_sec); return (0); }
- pthread_create
- thread 생성
- pthread.h
- pthread_detach
- 자원을 반납하도록 함(detach 안쓰면 pthread_create() 로 생성한 쓰레드가 종료후에도 자원을 점유하고 있음.)
- pthread_join
- 쓰레드가 끝날때까지 프로그램을 끝내지 않고 기다림
#include <pthread.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/errno.h> void print_index_loop(char *str, int max) { int i; i = 0; while (i < max) { printf("[%s]i is %d\n", str, i); usleep(1000 * 100); ++i; } } void *thread_routine(void *arg) { print_index_loop("thread", 5); return (NULL); } int main() { pthread_t tid; int create_res; int detach_res; int join_res; // [ 1. create new thread in this process ] // args: 1.thread(ID) // 2.attr(info of new thread, generally filled with NULL) // 3.function ptr // 4.function's argument // success -> return: 0 // fail -> return: errno create_res = pthread_create(&tid, NULL, thread_routine, NULL); if (create_res != 0) return (1); print_index_loop("main", 3); // [ 2. detach thread from main thread ] // success -> return: 0 // fail -> return: errno detach_res = pthread_detach(tid); printf("detaced result: %d\n", detach_res); // [ 3. (join)wait for thread ] // args: 1. thread(ID) // 2.thread function's return value join_res = pthread_join(tid, NULL); printf("join result: %d\n", join_res); return (0); }
mutex
상호 배제(相互排除, mutual exclusion, Mutex, 뮤텍스)는 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역(critical section)으로 불리는 코드 영역에 의해 구현된다.
공유 불가능한 자원의 예로는 동시에 실행되고 있는 프로그램간의 통신에 사용되는 비트 단위의 깃발, 계수기, 큐 등이다. 문제는 스레드가 언제라도 정지되거나 시작될 수 있다는 것이다.
교착상태의 4가지 조건 중 하나이다.
[mutex 출처]
[교착상태 출처]- pthread_mutex_init
- create new mutex
- pthread_mutex_destroy
- destroy mutex
- pthread_mutex_lock
- pthread_mutex_unlock
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> pthread_mutex_t mutex; int g_number; void print_index_loop(char *str, int max) { int i; i = 0; pthread_mutex_lock(&mutex); while (i < max) { g_number++; printf("[%s] %d\n", str, g_number); usleep(1000 * 100); ++i; } pthread_mutex_unlock(&mutex); } void *thread_routine(void *arg) { print_index_loop((char *)arg , 5); return (NULL); } int main() { pthread_t tid; void *t_res; int state; int create_res; int join_res; //pthread_mutex_init -- create a mutex // args: 1. mutex() // 2. attr(속성) if it's NULL --> default attributes are used. // success: 0, fail: errno g_number = 0; state = pthread_mutex_init(&mutex, NULL); if (state) { printf("fail to init mutex\n"); exit(1); } create_res = pthread_create(&tid, NULL, thread_routine, (void *)"thread"); if (create_res != 0) return (1); thread_routine((void *)"main"); join_res = pthread_join(tid, NULL); printf("join result: %d\n", join_res); }
//mutex를 쓰지 않으면 나오는 결과//
[main] 1 [thread] 2 [main] 3 [thread] 4 [main] 5 [thread] 6 [main] 7 [thread] 8 [main] 9 [thread] 10
//mutex를 쓰면 나오는 결과//
[main] 1 [main] 2 [main] 3 [main] 4 [main] 5 [thread] 6 [thread] 7 [thread] 8 [thread] 9 [thread] 10
오늘 공부한 시간: 3시간
오늘 공부한 것: 첫번째 문제의 개괄, 사용 허용된 함수 중에 모르는 함수 공부
누적 시간: 3시간 30분
'42seoul' 카테고리의 다른 글
[Philosophers] Bonus part 함수 공부 (sem) (0) 2021.06.14 [Makefile] make: *** [test] Error 1 (0) 2021.05.25 [Philosophers] 필로소퍼 70시간만에 끝내기(1)-과제파악하기 (0) 2021.05.18 [libasm] 어셈블리 (about 1 week) - 2일차(ft_strlen, ft_strcmp) (0) 2021.05.06 [libasm] 어셈블리 (about 1 week) - 2일차(ft_write, ft_read) (0) 2021.05.06