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;
}
#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
...
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
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;
}
#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
$
num 100
thread join : 10000
$