条件变量是一种同步机制,用于等待某个条件的成立。它通常与互斥锁(mutex)一起使用,以防止多个线程同时访问共享资源。条件变量允许线程在某个条件不满足时进入睡眠状态,并在条件改变时被唤醒。
主要操作:
pthread_cond_wait
:等待条件变量,释放互斥锁并进入睡眠状态,直到被其他线程唤醒。pthread_cond_signal
:唤醒一个等待该条件变量的线程。pthread_cond_broadcast
:唤醒所有等待该条件变量的线程。信号量是一种计数器,用于控制多个进程或线程对共享资源的访问。它有两种基本类型:二进制信号量和计数信号量。
主要操作:
sem_wait
:尝试减少信号量的值,如果值为零则阻塞。sem_post
:增加信号量的值,并可能唤醒等待的线程。#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;
void* producer(void* arg) {
pthread_mutex_lock(&mutex);
ready = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
return NULL;
}
void* consumer(void* arg) {
pthread_mutex_lock(&mutex);
while (!ready) {
pthread_cond_wait(&cond, &mutex);
}
printf("Consumer: Data is ready!\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
sem_t sem;
void* thread_func(void* arg) {
sem_wait(&sem);
printf("Thread entered critical section.\n");
// Critical section
sem_post(&sem);
return NULL;
}
int main() {
sem_init(&sem, 0, 3); // Allow 3 threads in critical section at a time
pthread_t threads[10];
for (int i = 0; i < 10; ++i) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for (int i = 0; i < 10; ++i) {
pthread_join(threads[i], NULL);
}
sem_destroy(&sem);
return 0;
}
pthread_cond_wait
后都有对应的解锁和加锁操作。sem_destroy
,可能导致信号量资源未被正确释放。确保在程序结束前调用sem_destroy
。通过上述基础概念、示例代码以及常见问题的解决方法,可以有效地使用条件变量和信号量进行多线程编程和进程同步。
领取专属 10元无门槛券
手把手带您无忧上云