sem_t empty, full;
pthread_mutex_t mutex;
void producer() {
while (1) {
// 데이터 생성
sem_wait(&empty); // 버퍼가 비어있는지 확인
pthread_mutex_lock(&mutex); // 버퍼에 접근하기 위한 락
// 데이터 추가
pthread_mutex_unlock(&mutex); // 락 해제
sem_post(&full); // 버퍼가 채워진 것을 알림
}
}
void consumer() {
while (1) {
sem_wait(&full); // 버퍼가 채워진 것을 확인
pthread_mutex_lock(&mutex); // 버퍼에 접근하기 위한 락
// 데이터 소비
pthread_mutex_unlock(&mutex); // 락 해제
sem_post(&empty); // 버퍼가 비어있는 것을 알림
}
}
while (__sync_lock_test_and_set(&lock, 1)) {
// 락이 해제될 때까지 계속 대기 (spin)
}
pthread_rwlock_t lock;
pthread_rwlock_rdlock(&lock); // 읽기 락
// 읽기 작업 수행
pthread_rwlock_unlock(&lock); // 락 해제
pthread_rwlock_wrlock(&lock); // 쓰기 락
// 쓰기 작업 수행
pthread_rwlock_unlock(&lock); // 락 해제
POSIX란? POSIX는 Portable Operating System Interface의 약자로, 표준화된 운영체제 인터페이스를 제공하는 프로젝트입니다. POSIX 표준은 다양한 운영체제에서 일관된 동작을 보장하기 위해 설계되었습니다. 우리가 사용하는 리눅스, macos, windows 등 대부분의 운영체제가 POSIX 표준을 따르고 있습니다.
pthread
라이브러리를 통해 뮤텍스와 세마포어를 사용할 수 있습니다.pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
pthread_mutex_lock(&lock);
// 임계구역 코드
pthread_mutex_unlock(&lock);
sem_t sem;
sem_init(&sem, 0, 3); // 동시 접근 가능 횟수: 3
sem_wait(&sem);
// 공유 자원 접근
sem_post(&sem);
synchronized
키워드로 간단하게 임계구역을 정의할 수 있습니다.public synchronized void increment() {
count++;
}
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 임계구역
} finally {
lock.unlock();
}