반응형
pthread_attr: http://bitsoul.tistory.com/168
출처:
http://xucxo.blogspot.com/2011/03/linux-programming-thread.html: 함수에 대한 상세한 추가 설명이 좋다:
http://underresearch.blogspot.kr/2013/05/pthread-thread.html
http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226
http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread
http://m.blog.naver.com/cky5122/80198083088
http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226
http://blog.naver.com/rbosc/90016327317
PThread - 리눅스에서 Thread 이용하기
Thread를 이용해야할 때까 있어서 공부를 했다
근데 리눅스에서 PThread를 사용하는 것이 윈도우 Visual Studio에서 지원하는 Thread를 사용하는 것보다 쉬워보였다.
그래서 PThread만 공부한 적이 있다.
처음엔 복잡한줄 알았는데 막상 공부해보니 쉬웠다.
처음 포스트인데 이번에는 PThread를 사용해서 간단한 프로그램을 작성할 것이다.
PThread는 리눅스에서만 되는것이 아니라 윈도우에서 MinGW를 설치하면 사용할 수 있다.
프로그램이 동작하는것은 이러하다.main에서 사용자에게 숫자 num을 입력받고 Thread 2개를 생성한다.하나의 Thread에서는 1부터 num까지 숫자를 카운트 하고 다른 하나의 Thread는 1부터 num까지 합한다.
또한 1부터 num까지 세는 Thread는 하나씩 셀 때마다 1000마이크로 초(1ms)를 쉰다
쉬지 않으면 SumThread가 끝나기 전에 CountThread가 끝나버려서 Thread가 제대로 돌아갔는지 알 수 없기 때문이다.
PThread를 사용하려면 pthread.h를 인클루드 시켜줘야 한다.
또한 pthread_t 라는 자료형의 변수와 함수들을 사용해 thread를 제어한다.
pthread_t라는 변수형은 thread의 id를 저장한다.
이 프로그램에서 사용한 함수들은 이렇다.
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
이 함수는 thread를 생성하는 함수이다.
첫번째 인자는 생성할 thread의 id
두번째 인자는 thread의 특성인데, 보통 NULL을 집어넣는다.
세번째 인자는 thread를 실행할 함수가 온다. thread를 실행할 함수는 포인터 함수이므로 인자값으로 올 수 있다.
네번째 인자는 thread를 실행할 함수에 넣어줄 인자값이 온다. 인자값은 하나지만 여러개의 인자값을 넣어주는 꼼수도 존재한다.(이건 다음에 포스팅)
int pthread_join(pthread_t thread, void **rval_ptr);
이 함수는 main이나 부모 thread에서 자식 thread가 종료할 때까지 대기하는 함수이다. main이나 부모thread가 끝나버리면 자식 thread 또한 종료되기 때문이다.
첫번째 인자는 생성한 thread의 id
두번째 인자는 해당 thread가 종료되면 return받을 변수. 리턴받을 값이 없으면 NULL을 넣으면 된다.
근데 리눅스에서 PThread를 사용하는 것이 윈도우 Visual Studio에서 지원하는 Thread를 사용하는 것보다 쉬워보였다.
그래서 PThread만 공부한 적이 있다.
처음엔 복잡한줄 알았는데 막상 공부해보니 쉬웠다.
처음 포스트인데 이번에는 PThread를 사용해서 간단한 프로그램을 작성할 것이다.
PThread는 리눅스에서만 되는것이 아니라 윈도우에서 MinGW를 설치하면 사용할 수 있다.
프로그램이 동작하는것은 이러하다.main에서 사용자에게 숫자 num을 입력받고 Thread 2개를 생성한다.하나의 Thread에서는 1부터 num까지 숫자를 카운트 하고 다른 하나의 Thread는 1부터 num까지 합한다.
또한 1부터 num까지 세는 Thread는 하나씩 셀 때마다 1000마이크로 초(1ms)를 쉰다
쉬지 않으면 SumThread가 끝나기 전에 CountThread가 끝나버려서 Thread가 제대로 돌아갔는지 알 수 없기 때문이다.
PThread를 사용하려면 pthread.h를 인클루드 시켜줘야 한다.
또한 pthread_t 라는 자료형의 변수와 함수들을 사용해 thread를 제어한다.
pthread_t라는 변수형은 thread의 id를 저장한다.
이 프로그램에서 사용한 함수들은 이렇다.
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
이 함수는 thread를 생성하는 함수이다.
첫번째 인자는 생성할 thread의 id
두번째 인자는 thread의 특성인데, 보통 NULL을 집어넣는다.
세번째 인자는 thread를 실행할 함수가 온다. thread를 실행할 함수는 포인터 함수이므로 인자값으로 올 수 있다.
네번째 인자는 thread를 실행할 함수에 넣어줄 인자값이 온다. 인자값은 하나지만 여러개의 인자값을 넣어주는 꼼수도 존재한다.(이건 다음에 포스팅)
int pthread_join(pthread_t thread, void **rval_ptr);
이 함수는 main이나 부모 thread에서 자식 thread가 종료할 때까지 대기하는 함수이다. main이나 부모thread가 끝나버리면 자식 thread 또한 종료되기 때문이다.
첫번째 인자는 생성한 thread의 id
두번째 인자는 해당 thread가 종료되면 return받을 변수. 리턴받을 값이 없으면 NULL을 넣으면 된다.
추가설명: https://www.joinc.co.kr/w/man/3/pthread_join
void pthread_exit(void *rval_ptr);
이 함수는 thread를 종료할 때 사용한다.
첫번째 인자는 thread를 종료하고 pthread_join() 함수 두번째 인자에 리턴할 변수. 리턴할 값이 없으면 NULL을 넣으면 된다.
pthread_t pthread_self(void)
이 함수는 실행하고 있는 thread의 id를 리턴한다.
또한 gcc에서 PThread를 사용할 소스를 컴파일 할때 맨 뒤에 -lpthread 명령어를 붙여줘야 한다.
이런식으로
MinGW로 컴파일 할때도 마찬가지.
아래는 소스.
앞에서 언급했듯이 pthread를 사용할 때 인자를 하나만 넣을 수 있는데 여러개를 넣는 꼼수가 존재한다. 구조체를 사용하는 방법이 있는데, 이것은 다음에 포스팅 하겠다.
void pthread_exit(void *rval_ptr);
이 함수는 thread를 종료할 때 사용한다.
첫번째 인자는 thread를 종료하고 pthread_join() 함수 두번째 인자에 리턴할 변수. 리턴할 값이 없으면 NULL을 넣으면 된다.
pthread_t pthread_self(void)
이 함수는 실행하고 있는 thread의 id를 리턴한다.
또한 gcc에서 PThread를 사용할 소스를 컴파일 할때 맨 뒤에 -lpthread 명령어를 붙여줘야 한다.
이런식으로
MinGW로 컴파일 할때도 마찬가지.
아래는 소스.
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- void *CountThread(void *);
- void *SumThread(void *);
- int main(void)
- {
- int num;
- int result[2];
- int i, rc;
- pthread_t threads[2];
- printf("input number : ");
- scanf("%d", &num);
- pthread_create(&threads[0], NULL, &CountThread, (void *)&num); //Count를 할 Thread함수를 threads[0]에서 실행(인자값은 num)
- pthread_create(&threads[1], NULL, &SumThread, (void *)&num); //Sum을 구할 Thread함수를 threads[1]에서 실행(인자값은 num)
- for(i = 0; i < 2; i++)
- {
- rc = pthread_join(threads[i], (void **)&result[i]);
- if(rc != 0) //rc가 0이 아니면 오류 발생
- {
- printf("Error in thread[%d] : %d\n", i, rc);
- exit(1);
- }
- }
- printf("Result of CountThread : %d\n", result[0]);
- printf("Result of SumThread : %d\n", result[1]);
- return 0;
- }
- void *CountThread(void *arg)
- {
- int i;
- int num = *(int *)arg; //인자값을 사용해야할 때마다 일일이 void* 포인터에서 int* 포인터로 바꿔줘야 해서 귀찮아지므로 그냥 변수를 하나 만들어서 인자값을 넣어줌
- for(i = 1; i <= num; i++)
- {
- printf("In CountThread(0x%lx) : %d\n", pthread_self(), i);
- usleep(1000);
- }
- printf("CountThread End\n");
- pthread_exit(NULL); //인자값을 return하고 Thread함수 종료
- }
- void *SumThread(void *arg)
- {
- int result, i;
- int num = *(int *)arg;
- for(result = 0, i = 1; i <= num; i++)
- result += i;
- printf("SumThread End\n");
- pthread_exit((void *)result); //인자값을 return하고 Thread함수 종료(인자값이 void형 포인터로 들어가므로 void형 포인터로 형변환)
- }
앞에서 언급했듯이 pthread를 사용할 때 인자를 하나만 넣을 수 있는데 여러개를 넣는 꼼수가 존재한다. 구조체를 사용하는 방법이 있는데, 이것은 다음에 포스팅 하겠다.
'OS > LINUX' 카테고리의 다른 글
make 컴파일 에러시 쉘 스크립트 중단 (0) | 2016.03.23 |
---|---|
리눅스 쉘 색깔 바꾸기 (0) | 2015.02.04 |
리눅스 ip, gateway, netmask, mac 찾는 코드 (0) | 2014.11.05 |
리눅스 IP 주소 / 링크 상태 변경 여부 감지하기 (0) | 2014.11.05 |
/lib/libc.so.6: version `GLIBC_2.7' not found (0) | 2014.03.18 |