上一篇
在多线程编程中,线程同步是一个核心问题。本文将带你使用POSIX信号量实现经典的生产者-消费者模型,帮助你深入理解Linux多线程同步机制。
生产者-消费者模型描述了两个线程(或多个)共享一个固定大小的缓冲区,生产者负责生产数据放入缓冲区,消费者负责从缓冲区取出数据处理。关键在于避免并发冲突,保证数据一致性。
POSIX信号量是一种用于线程同步的机制,主要函数包括sem_init、sem_wait、sem_post和sem_destroy。信号量可以控制资源的访问数量。
#include #include #include #include #define BUFFER_SIZE 5int buffer[BUFFER_SIZE];int in = 0, out = 0;sem_t empty, full;pthread_mutex_t mutex;void* producer(void* arg) { int item = 1; while (1) { sem_wait(&empty); pthread_mutex_lock(&mutex); buffer[in] = item; printf("生产者生产: %d at %d", item, in); in = (in + 1) % BUFFER_SIZE; item++; pthread_mutex_unlock(&mutex); sem_post(&full); sleep(1); } return NULL;}void* consumer(void* arg) { while (1) { sem_wait(&full); pthread_mutex_lock(&mutex); int item = buffer[out]; printf("消费者消费: %d from %d", item, out); out = (out + 1) % BUFFER_SIZE; pthread_mutex_unlock(&mutex); sem_post(&empty); sleep(2); } return NULL;}int main() { pthread_t prod, cons; sem_init(&empty, 0, BUFFER_SIZE); sem_init(&full, 0, 0); pthread_mutex_init(&mutex, NULL); pthread_create(&prod, NULL, producer, NULL); pthread_create(&cons, NULL, consumer, NULL); pthread_join(prod, NULL); pthread_join(cons, NULL); sem_destroy(&empty); sem_destroy(&full); pthread_mutex_destroy(&mutex); return 0;} 代码中,POSIX信号量empty和full分别表示空闲缓冲区和满缓冲区数量。sem_wait等待资源,sem_post释放资源。互斥锁保证对缓冲区的互斥访问。
编译运行上述代码,你将看到生产者与消费者交替工作。这个例子展示了如何通过线程同步避免竞争条件,是Linux多线程编程的经典案例。掌握生产者-消费者模型,对理解操作系统并发至关重要。
关键词:Linux多线程、POSIX信号量、生产者-消费者模型、线程同步
本文由主机测评网于2026-02-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260227060.html