linux system programming, 238p. 두 시간 삽질했다. thread arg 를 포인터로 주는데 여러 개를 쓰려면 struct로 정의해서 써야 한댄다. 맞는지 틀린지..
#include <pthread.h> #include <stdio.h> #include <unistd.h> //arg를 여러 파라미터로 사용하기 위해, //구조체로 정의 //https://stackoverflow.com/questions/52812004/parameter-passing-multiple-values-using-void-pointer //여기 참조 //공유 자원. int sharedInt=0; //mutex 설정. static pthread_mutex_t the_mutex = PTHREAD_MUTEX_INITIALIZER; struct myStruct { //struct는 initilizer를 지원하지 않음. char *message; int index; //index를 보고 입력된 파라미터로 hello, one, two, three를 선택. //이렇게 구현하려 했으나, 힘들어 문자열로 변경. //index로 sharedInt를 업데이트 하려 했으나, //잘 안됨.. //스레드가 시작할 때마다 sharedInt를 업데이트 하면 기존 값을 //버리고 다시 씀!! //thread 안에서만 공유 자원을 조작.. }; void* start_routine(void* arg ){ int pid; int threadID; //struct로 arg를 받기 위해, //struct로 변경. struct myStruct *temp; temp = arg; //pointer 로 global 변수 변경 //pthread_mutex_lock(&the_mutex); //sharedInt = temp->index; //printf("my thread sentence is \"%s\"\n", temp->message); //printf("temp->index is %d\n", temp->index); pthread_mutex_lock(&the_mutex); printf("SharedInt는 %d\n",sharedInt); if(sharedInt == 0){ //strsep(temp->message, " "); //printf("my thread word is %s\n",outputword); printf("zero\n"); //temp->index++; } else if(sharedInt == 1){ //printf("my thread word is %s\n",outputword); printf("one\n"); //temp->index++; } else if(sharedInt == 2){ printf("two\n"); //temp->index++; } else{ printf("three or more\n"); } sharedInt++; pthread_mutex_unlock(&the_mutex); } int main(){ pthread_t thread[2]; int ret, errorno; struct myStruct message = {"hello one two three", 0 }; printf("myStruct message index는 %d\n", message.index); //아래 부분은 불필요 부분. thread 밖에서 조작하여 무의미함. //message.index=2; ret = pthread_create(&thread[0],NULL,start_routine,(void*)&message); if(ret<0){ errorno = ret; //printf("%d\n",errorno); perror("pthread_create"); return -1; } //아래 부분은 불필요 부분. thread 밖에서 조작하여 무의미함. //message.index=1; //printf("myStruct message index는 %d\n", message.index); //printf("struct 출력: %d",message.index); //printf("message 확인 %d",message.index); ret = pthread_create(&thread[1],NULL,start_routine,(void*)&message); if(ret<0){ errorno = ret; //printf("%d\n",errorno); perror("pthread_create"); return -1; } //각 스레드 끝나길 대기 pthread_join(thread[0],NULL); pthread_join(thread[1],NULL); //mutex 삭제 pthread_mutex_destroy(&the_mutex); printf("completed\n"); return 0; }
100번 돌리면 mutex lock을 설정한 경우와 설정하지 않은 경우 값이 다름. 나름 이해했다고 믿고 싶다.