본문 바로가기

LINUX/시스템 프로그래밍

[시스템프로그래밍] thread 문제

728x90

이번엔 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);
}

 

크기 때문에 오류가 났다.., 흑흑쓴 이거 진짜 별거 아닌데 그땐 머리가 터져있어서 알아채기 어려웠다..

728x90

'LINUX > 시스템 프로그래밍' 카테고리의 다른 글

[시스템프로그래밍] 쉘(shell) 만들기  (0) 2022.06.29