条件变量:一个生产者,一个消费者,生产者将变量++,消费者将变量--,但是消费者只能在变量>0时才能--,生产者只能在变量<10时才++。
//thread.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
void *func1(void *);
void *func2(void *);
int g_a=0;
pthread_mutex_t pt;
pthread_cond_t ct;
pthread_cond_t ct2;
int main()
{
pthread_t pt1,pt2;
// init
pthread_mutex_init(&pt, NULL);
pthread_cond_init(&ct,NULL);
pthread_cond_init(&ct2,NULL);
//start sub thread
pthread_create(&pt1, NULL, func1, NULL);
pthread_create(&pt2, NULL, func2, NULL);
pthread_join(pt1,NULL);
pthread_join(pt2,NULL);
// destroy
pthread_mutex_destroy(&pt);
pthread_cond_destroy(&ct);
pthread_cond_destroy(&ct2);
return 0;
}
//生产者
void *func1(void*d)
{
while(1)
{
// 获得锁
while(pthread_mutex_trylock(&pt)!=0)
{
printf("EBUSY\n");
}
// 大于10,则释放锁,让消费者进程来减少g_a的取值
if(g_a>=10)
pthread_cond_wait(&ct2, &pt);
// ++
g_a++;
printf("produce one; g_a = %d\n", g_a);
//大于0时通知消费者线程,可以消费了。
pthread_mutex_unlock(&pt);
if(g_a>0)
pthread_cond_signal(&ct);
}
return NULL;
}
//消费者
void *func2(void*d)
{
while(1)
{
//获得锁
while(pthread_mutex_trylock(&pt)!=0)
{
printf("EBUSY\n");
}
// g_a>0才可以消费
if(g_a<=0)
pthread_cond_wait(&ct, &pt);
g_a--;
printf("eat one; g_a = %d\n", g_a);
//释放锁
pthread_mutex_unlock(&pt);
//<10时通知生产者线程,可以生产了!
if(g_a<10)
pthread_cond_signal(&ct2);
}
return NULL;
}
执行结果:
administrator@ubuntu:~/test$ gcc thread.c -lpthread -o p
produce one; g_a = 1
produce one; g_a = 2
produce one; g_a = 3
produce one; g_a = 4
produce one; g_a = 5
produce one; g_a = 6
produce one; g_a = 7
produce one; g_a = 8
produce one; g_a = 9
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
eat one; g_a = 8
eat one; g_a = 7
eat one; g_a = 6
eat one; g_a = 5
eat one; g_a = 4
eat one; g_a = 3
eat one; g_a = 2
eat one; g_a = 1
eat one; g_a = 0
produce one; g_a = 1
produce one; g_a = 2
produce one; g_a = 3
produce one; g_a = 4
produce one; g_a = 5
produce one; g_a = 6
produce one; g_a = 7
produce one; g_a = 8
produce one; g_a = 9
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
EBUSY
eat one; g_a = 8
EBUSY
eat one; g_a = 7
EBUSY
eat one; g_a = 6
produce one; g_a = 7
EBUSY
produce one; g_a = 8
produce one; g_a = 9
EBUSY
produce one; g_a = 10
EBUSY
eat one; g_a = 9
eat one; g_a = 8
eat one; g_a = 7
eat one; g_a = 6
eat one; g_a = 5
eat one; g_a = 4
eat one; g_a = 3
eat one; g_a = 2
eat one; g_a = 1
eat one; g_a = 0