void *thread_function(void *arg) { printf("thread function is running. Argument was %s\n", (char*)arg); sleep(3); strcpy(message, "bye!"); pthread_exit("Thank you for the CPU time"); }
int main(void) { int res; pthread_t a_thread; void *thread_result;
/* * 쓰레드 생성 * 성공하면 0을 리턴, 그렇지않으면 errno 설정 */ res = pthread_create(&a_thread, NULL, thread_function, (void*)message); if (res != 0) { perror("thread creation failed"); exit(EXIT_FAILURE); }
printf("waiting for thread to finish...\n"); /* * 지정된 쓰레드가 종료될때까지 대기 * pthread_exit로 리턴된 값을 포인터로 받아온다 */ res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("thread creation failed"); exit(EXIT_FAILURE); }
/* * pthread_join에서 pthread_exit로 리턴된 값이 출력 */ printf("Thread joined , it returned %s\n", (char*)thread_result); printf("Message is now %s\n", message);
return EXIT_SUCCESS;
}
동기화
1. 세마포어
2. 뮤텍스
하나의 쓰레드만 오브젝트를 사용할 수 있도록 잠그고 푼다
성공시 0을 반환, 실패의 경우 에러 코드가 반환되지만, errno는 설정되지 않음
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
void *thread_function(void *arg);
pthread_mutex_t work_mutex; /* protects both work_area and time_to_exit */
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int time_to_exit = 0;
int main() {
int res;
pthread_t a_thread;
void *thread_result;
/*
* 뮤택스 초기화
*/
res = pthread_mutex_init(&work_mutex, NULL);
if (res != 0) {
perror("Mutex initialization failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if (res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
/*
* 락킹
*/
pthread_mutex_lock(&work_mutex);
printf("Input some text. Enter 'end' to finish\n");