在linux多线程同步中,除了互斥量以外,pthread提供了另一种同步机制:条件变量。正如名字一样,条件量允许线程由于一些未达到的条件而阻塞。
条件变量与互斥量经常一起使用。这种模式用于让一个线程锁住一个变量,然后当它不能获得它期待的结果时等待一个条件变量。最后另一个线程会向他发出信号,使它可以继续执行。pthread_cond_wait原子性地调用并解锁它持有的互斥量。由于这个原因,互斥量是参数之一。
下面通过代码演示如何通过条件量来解决生产者消费者问题。
#include<stdio.h> #include<pthread.h> #define MAX 100 pthread_mutex_t the_mutex; pthread_cond_t condc,condp; int buffer=0;//这里为了方面,将缓冲区定为1 void *producer(void *ptr)//生产数据 { int i; for(i=1;i<=MAX;i++) { pthread_mutex_lock(&the_mutex);//互斥使用缓冲区 while(buffer!=0) { pthread_cond_wait(&condp,&the_mutex); } buffer=i; printf("生产者生产了一件产品!!!\n"); pthread_cond_signal(&condc); pthread_mutex_unlock(&the_mutex); } pthread_exit(0); } void *consumer(void *ptr)//消费数据 { int i; for(i=1;i<MAX;i++) { pthread_mutex_lock(&the_mutex);//互斥使用缓冲区 while(buffer==0) { pthread_cond_wait(&condc,&the_mutex); } buffer=0; printf("消费者消费了一件产品!!!\n"); pthread_cond_signal(&condp); pthread_mutex_unlock(&the_mutex); } pthread_exit(0); } int main() { pthread_t pro,con; pthread_mutex_init(&the_mutex,0); pthread_cond_init(&condc,0); pthread_cond_init(&condp,0); pthread_create(&con,0,consumer,0); pthread_create(&pro,0,producer,0); pthread_join(pro,0); pthread_join(con,0); pthread_cond_destroy(&condc); pthread_cond_destroy(&condp); pthread_mutex_destroy(&the_mutex); return 0; }
时间: 2024-10-13 02:23:13