본문 바로가기

프로그래밍/프로그램

Java, C로 Thread(쓰레드) 구현하기

이번 포스팅에선 우분투 환경에서 Java와 C로 쓰레드를 구현해 보겠습니다.

쓰레드란?

쓰레드란 간단히 말하면 작업단위 입니다. 예전 컴퓨터에서는 작업단위가 프로세스 였으나 현대에는

한 프로세스 안에 또 여러개의 쓰레드를 동시에 돌릴수 있습니다. 사실 완벽히 동시(simultaneous)는 아니고 마치 동시에 작동하는 것처럼(concurrent) 보이는 것입니다. 예시로 형광등은 사실 1초에 100번정도 깜빡거리는데 사람의 눈은 그냥 켜져있는것 처럼보이는것과 같은 원리 입니다.

흔히 프로그램을 짤때 main()함수의 한 흐름이 있는데요. 또다른 쓰레드를 만들지 않는다면 이 프로그램은 단일 쓰레드

프로그램입니다. 하지만 성능 향상을 위해 한개 이상 쓰레드를 만드는 경우 다중 쓰레드 프로그램이 되고 운영체제는 그 만의 정책에 따라 쓰레드를 바꾸면서 CPU 스케쥴링을 합니다. 오늘은 간단하게 다중 쓰레드 프로그램을 구현해 보도록 하겠습니다.

 

먼저 C를 보시고 Java를 보시면 자바가 쓰레드에 특화돼 있다 할만큼 쉽게 느껴지실것 같습니다.

Code

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int sum,a;
void *runner(void *param);

int main(int argc, char* argv[]){
    pthread_t tid;
    pthread_attr_t attr;
    a = atoi(argv[1]);
    if(argc<2){
        fprintf(stderr,"usage:hello.out <integer>\n");
        exit(0);
    }

    if(atoi(argv[1])<0){
        fprintf(stderr,"%d must be <= 0\n", atoi(argv[1]));
        exit(0);
    }

    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, runner, argv[1]);

    for(int i=0; i<atoi(argv[1]); i++){
        printf("A");
    }

}

void *runner(void* param){

    int i;
    sum = 0;
    if(a>0)
        for(i=1; i<=a; i++)
            printf("B");
    pthread_exit(0);

}

 

pthread.h 헤더를 include 해줘야하고 변수들과 함수들에 주소 인자를 넣어줘야해서 좀 복잡합니다.

argc는 넘겨주는 argument의 개수이고요 그 내용은 args[] 배열에 담김니다. 그리고 runner 함수 부분이 새로 생긴 쓰레드가 앞으로 돌게될 부분입니다. runner가 새로운 쓰레드의 main함수 비슷한 역할을 하신다고 봐도 좋을것 같네요.

터미널에서 컴파일하고 실행하는 방법을 설명해 드리겠습니다.

 

-o 는 이름을 정하는 옵션이고 저는 hi로 바꿨습니다 -lpthread 옵션도 넣어주셔야 컴파일이 됩니다.

이렇게 치시면 hi라는 실행파일이 만들어 집니다.

 

hi라는 실행 파일이 만들어진 모습

 

./hi 로 실행 시킬수 있습니다

이렇게 실행을 시키면 args[0] = "hi" , args[1] = "10000000"로 대입이 됩니다.

실행 결과는 다음과 같습니다.

 

두개의 쓰레드가 엎치락 뒤치락 동시에 실행되고 있음을 알수 있습니다.

 

네 이제 복잡한 C말고 쉽게 클래스를 상속하고 구현하는 Java에 대해 살펴보겠습니다.

 

Code

package collection;

public class Test {

	public static void main(String[] args){
		int a = Integer.parseInt(args[0]);
		myThread t = new myThread(a);
		t.start();
		for(int i=0;i < a ;i++) {
			System.out.print("A");
		}
	}
}

class myThread extends Thread{
	private int k;
	
	myThread(int k){
		this.k = k;
	}
	
	public void run() {
		for(int i=0; i < k ; i++) {
			System.out.print("B");
		}
		
	}
	
}

Thread 클래스를 상속하기만하고 run()함수를 오버라이딩 해주기만하면 끝입니다. 정말 간단하죠? 그래서 자바는 쓰레드에 특화돼 있다고도 합니다. t.start() 부분에서 run함수가 호출되어 새로운 쓰레드가 시작하고 main() 쓰레드도 같이 돕니다.

 

실행 방법은 C와 비슷합니다.

 

java라는 명령어로 실행시킵니다.

 

이때 args[0] = 1000000이 됩니다 C와는 파일명을 받지 않는 차이만 있네요.

다음은 실행 결과입니다.

 

 

출력 결과로 부터 두개의 쓰레드가 모두 잘 작동하고 있음을 알수 있습니다.

저라면 쓰레드를 구현할땐 C보단 Java를 더 선호할것 같습니다.

감사합니다.

'프로그래밍 > 프로그램' 카테고리의 다른 글

aws 배포방법 팁  (0) 2024.01.17