이번엔 thread.,.th 발음 어렵다
<조건>
- main 함수는 thread를 생성하여 실행하고, 생성한 thread가 종료할 때까지 기다리며, thread가 종료하면 화면에 thread가 return 한 값을 “%d”로 출력하고 종료한다.
- main 함수는 thread를 실행할 때, 실행되는 thread의 파라메타로 argv[1] 값을 넘겨준다.
- thread 함수는 실행시 입력되는 argv[1] 값을 숫자로 변경하여(atoi 함수 이용), argv[1] 값의 제곱 값을 리턴한다.
argv[1] 값을 atoi 함수를 이용해 숫자로 변경하기.,.,이거 까진 됐는데 return 할때 제대로된 값이 안들어갔다.,,.
왜지왜지왜지..?!
----> 찾아보니.,, 포인터값은 8바이트인데 정수값 즉, int는 4바이트니까 이게 크기가 안 맞아서 그런듯 싶은 듯 하다. 그래서 long을 쓰면 됨..!long!long!long!!!
공부한 게 아까우니 thread에 대해서 몇 자 적어보겠음
thread는 프로그램을 실행할 때 코드가 실행되는 흐름
thread 생성
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
새로 생성할 thread의 id가 저장될 주소, 기본적으로 NULL값, thread가 실행할 함수의 포인터, 함수에게 넘기고 싶은 인자
그래서 나는 코드에서 pthread_create(&handle, NULL, func, argv[1]) 로 사용했다. handle이라는 thread, argv[1]값을 넘길 func이라는 함수
int pthread_join(pthread_t thread, void **rval_ptr);
main thread가 생성한 스레드가 종료될 때까지 기다리는 함수
pthread_join을 호출한 스레드는 그 스레드가 pthread_exit를 호출할 때까지 대기한다
void pthread_exit(void *rval_ptr);
이 코드에서는 안썼지만.,, thread를 종료하는 함수. 인자는 pthread_join의 두 번째 인자에서 받을 수 있다
<코드>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
void *func(void *arg){
char *s = (char *)arg;
printf("s = %s\n", s);
long unsigned int val;
val = atoi(s);
val = val*val;
return ((void *) val);
}
int main(int argc, char *argv[]){
pthread_t handle;
char line[256];
int s, res;
if(pthread_create(&handle, NULL, func, argv[1]) != 0){
perror("pthread_create() error");
exit(1);
}
printf("Thread created successfully\n");
if(pthread_join(handle, (void **)&res)!=0){
perror("pthread_join() error");
exit(3);
}
printf("thread return %d\n", res);
exit(EXIT_SUCCESS);
}
크기 때문에 오류가 났다.., 흑흑쓴 이거 진짜 별거 아닌데 그땐 머리가 터져있어서 알아채기 어려웠다..
'LINUX > 시스템 프로그래밍' 카테고리의 다른 글
[시스템프로그래밍] 쉘(shell) 만들기 (0) | 2022.06.29 |
---|