OS/Linux

Kernel thread test[정말 간단한]

아르비스 2010. 5. 12. 16:55

Thread의 개념도 완전하지 않은 상태에서 Linux kernel Thread를 만든 내용
정말 초 간단.. 한 소스
1초마다 2개의 thread에서 값을 출력하는 사항.
pthread_create 와 pthread_join 함수 사용
cpp를 컴파일 하기 위해서 g++를 사용했다.
그냥 gcc로 컴파일 하면, pthread 관련한 함수 들이 undefined로 출력된다.

[pthread_create.cpp]

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

// 쓰레드 함수
void *t_function(void *data)
{
    int id;
    int i = 0;
    id = *((int *)data);

    while(1)
    {
        printf("%d : %d\n", id, i);
        i++;
        sleep(1);
    }
}

int main()
{
    pthread_t p_thread[2];
    int thr_id;
    int status;
    int a = 1;
    int b = 2;

    // 쓰레드 생성 아규먼트로 1 을 넘긴다. 
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a);
    if (thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }

    // 쓰레드 생성 아규먼트로 2 를 넘긴다.
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b);
    if (thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }

    // 쓰레드 종료를 기다린다.
    pthread_join(p_thread[0], (void **)&status);
    pthread_join(p_thread[1], (void **)&status);

    return 0;
}
$ ./pthread_create
1 : 0
2 : 0
1 : 1
2 : 1
1 : 2
2 : 2
1 : 3
2 : 3
...

Makefile

#compiler name
CC = g++

#option for release
CFLAGS = -g -DLINUX -D_REETARANT

myapp: pthread_create.o
 $(CC) -o pthread_create pthread_create.o -lpthread -static

pthread_creade.o : pthread_create.cpp
 $(CC) $(CFLAGS) -c pthread_create.cpp

clean:
 rm -rf *.ko
 rm -rf *.mod.*
 rm -rf .*.cmd
 rm -rf *.o
 rm -rf .tmp_versions




[pthread_join.c]

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

// 쓰레드 함수
// 1초를 기다린후 아규먼트^2 을 리턴한다.
void *t_function(void *data)
{
    int num = *((int *)data);
    printf("num %d\n", num);
    sleep(1);
    return (void *)(num*num);
}

int main()
{
    pthread_t p_thread;
    int thr_id;
    int status;
    int a = 100;

    thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a);
    if (thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }
    // 쓰레드 식별자 p_thread 가 종료되길 기다렸다가
    // 종료리턴값을 가져온다.
    pthread_join(p_thread, (void **)&status);
    printf("thread join : %d\n", status);

    return 0;
}

 

$ ./pthread_joinc
num 100
thread join : 10000
$