-pthread 옵션을 사용합니다.-pthreads)-DPTHREAD, -D_REENTRANT)-lpthread)#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_function)(void *), void *arg);
start_function 함수에서 시작합니다.arg로 전달된 데이터를 인수로 받습니다.pthread_t thread;
pthread_create(&thread, NULL, thread_function, NULL);
void *(*start_function)(void *);
void * 인수를 받아 void *를 반환합니다.void *thread_main(void *arg) { return NULL; }
pthread_create()가 호출되면:pthread_create() 함수는 스레드 속성 객체를 수락합니다.pthread_attr_t 타입입니다.POSIX 스레드는 여러 가지 방법으로 종료할 수 있습니다:
pthread_exit() 호출pthread_cancel()을 호출하여 취소할 때분리되지 않은 스레드는 조인될 때까지 좀비 상태가 됩니다.
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
wait()와 유사합니다.pthread_detach()를 호출하여 분리될 수 있습니다.pthread_mutex_t 타입입니다.#include <pthread.h>
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_trylock()은 항상 즉시 반환합니다:EBUSY를 반환합니다.void deadlock() {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);
pthread_mutex_lock(&mutex);
}
#include <pthread.h>
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
extern pthread_mutex_t lock;
extern pthread_cond_t cond;
extern bool done;
void *block_until_done(void *ignored) {
pthread_mutex_lock(&lock);
while (!done) {
pthread_cond_wait(&cond, &lock);
}
pthread_mutex_unlock(&lock);
}
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
extern pthread_mutex_t lock;
extern pthread_cond_t cond;
extern bool done;
void signal_done() {
pthread_mutex_lock(&lock);
done = true;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
}
pthread.h에 포함되지 않으며, pthread_로 시작하지 않습니다.#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
pshared가 true이면 세마포어는 프로세스 간에 사용할 수 있습니다.#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
sem_wait()는 Dijkstra의 P() 연산에 해당하며, sem_post()는 V() 연산에 해당합니다.sem_trywait()는 pthread_mutex_trylock()과 유사합니다:EAGAIN을 반환합니다.#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdbool.h>
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
bool done = false;
void *block_until_done(void *ignored) {
pthread_mutex_lock(&lock);
while (!done) {
pthread_cond_wait(&cond, &lock);
}
pthread_mutex_unlock(&lock);
return NULL;
}
void signal_done() {
pthread_mutex_lock(&lock);
done = true;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
}
int main(int argc, char *argv[]) {
pthread_t t;
pthread_create(&t, NULL, block_until_done, NULL);
usleep(100000);
signal_done();
pthread_join(t, NULL);
return 0;
}
done 플래그가 설정될 때까지 스레드를 블록합니다.#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
sem_t sem;
void* worker(void* arg) {
sem_wait(&sem);
printf("Entered critical section\n");
// Critical section
sleep(2);
printf("Leaving critical section\n");
sem_post(&sem);
return NULL;
}
int main() {
pthread_t t1, t2;
sem_init(&sem, 0, 1);
pthread_create(&t1, NULL, worker, NULL);
sleep(1); // Ensure t1 starts first
pthread_create(&t2, NULL, worker, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
sem_destroy(&sem);
return 0;
}