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을 설정한 경우와 설정하지 않은 경우 값이 다름. 나름 이해했다고 믿고 싶다.