在线程中,互斥锁提供互斥机制,而条件变量则提供信号的机制。条件变量作为线程间通信的一种同步机制,通常与互斥锁配合使用,通过让一个线程进入睡眠,直到另一个线程通知它醒来才会继续处理事情。
以下是生产者消费者代码实现:A线程生产产品到共享数组,B线程从中消费。
#include <stdio.h>
#include <pthread.h>
#include <string.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; //并且初始化锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
char *p="ABCDE"; //产品
char buf[5]={0};
void* A(void* arg) //生产
{
int i;
for(i=0;i<5;i++)//生产5个产品
{
printf("produce:%c\n",*p);
pthread_mutex_lock(&mutex);
buf[i]=*p;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond); //唤醒沉睡线程
p++;
}
}
void* B(void* arg) //消费
{
char *ptr=buf;
int j;
for(j=0;j<5;j++)
{
while(*ptr==0) //没有产品 一直睡眠等待
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
printf("consume:%c\n",*ptr);
*ptr=0; //表示取走产品
ptr++; //查找下一个产品
//sleep(1);
}
}
int main()
{
pthread_t th1,th2;
pthread_create(&th1,NULL,A,NULL);
pthread_create(&th2,NULL,B,NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
return 0;
}
输出: