Translate

2013년 5월 14일 화요일

PThread - PThread에 여러개의 인자값 넣기

전에 포스팅 했던 게시글은 PThread에 하나의 인자값만 넣을 수 있었다.
이번에는 여러개의 인자값을 넣는 방법을 포스팅할 것이다.

인자값을 여러개 넣는 방법은 배열과 구조체를 넘기는 방법인데 배열은 같은 자료형만 넘길 수 있으니까 구조체를 이용해 넘기는 방법을 예제로 프로그래밍 했다.
프로그램상 배열을 넣어도 상관없지만.

프로그램은 그냥 숫자 2개를 입력받아 최소공배수, 최대공약수를 출력하는 프로그램이다.

 

역시 pthread.h를 인클루드 하고 쓰는 함수 또한 전에와 똑같다.
소스는 이러하다.
그리고 최대공약수는 유클리드 호제법을 이용했다.




여기서 PThread에서 처리할 변수 여러개를 Thdata 구조체로 묶어서 그 구조체 하나만을 넘겨주었다.


구조체를 인자값으로 받는것은 간단하다.

전에 포스팅 했던 게시글에서는 int형이였는데 그 대신 Thdata형으로 바뀐것  뿐이다.
그것 외엔 전에 포스팅했던 것과 똑같다.

다음엔 아마 안드로이드에서 Thread를 다루는 방법을 포스팅 할 것이다.
지금 학교에서 프로젝트를 하는데 안드로이드에서 MySQL을 연동할 수 있는 사람이 없던데
안드로이드에서 MySQL을 다루려면 먼저 안드로이드에서 Thread를 다룰 수 있어야 하기 때문에 안드로이드에서 Thread를 다루는 방법부터 포스팅 해야겠다.

2013년 5월 7일 화요일

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을 넣으면 된다.

void pthread_exit(void *rval_ptr);


이 함수는 thread를 종료할 때 사용한다.
첫번째 인자는 thread를 종료하고 pthread_join() 함수 두번째 인자에 리턴할 변수. 리턴할 값이 없으면 NULL을 넣으면 된다.

pthread_t pthread_self(void)

이 함수는 실행하고 있는 thread의 id를 리턴한다.


또한 gcc에서 PThread를 사용할 소스를 컴파일 할때 맨 뒤에 -lpthread 명령어를 붙여줘야 한다.



이런식으로
MinGW로 컴파일 할때도 마찬가지.

아래는 소스.




앞에서 언급했듯이 pthread를 사용할 때 인자를 하나만 넣을 수 있는데 여러개를 넣는 꼼수가 존재한다. 구조체를 사용하는 방법이 있는데, 이것은 다음에 포스팅 하겠다.