è¿ä¸ªé®é¢éè¦çç¥è¯ä¸»è¦å
æ¬ï¼
1 å¤è¿ç¨é´è¿è¡éä¿¡ï¼
2 使ç¨åæ¥ä¿¡å·éï¼semaphoreï¼åäºæ¥ä¿¡å·éï¼mutexï¼è¿è¡æ°æ®ä¿æ¤ã
åè代ç å¦ä¸ï¼å¯ä»¥åç
§æ³¨éè¾
å©ç解ï¼
#include <
stdio.h>
#include <
stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define N 2 // æ¶è´¹è
æè
ç产è
çæ°ç®
#define M 10 // ç¼å²æ°ç®
int in = 0; // ç产è
æ¾ç½®äº§åçä½ç½®
int out = 0; // æ¶è´¹è
å产åçä½ç½®
int buff[M] = {0}; // ç¼å²åå§å为0ï¼ å¼å§æ¶æ²¡æ产å
sem_t empty_sem; // åæ¥ä¿¡å·éï¼ å½æ»¡äºæ¶é»æ¢ç产è
æ¾äº§å
sem_t full_sem; // åæ¥ä¿¡å·éï¼ å½æ²¡äº§åæ¶é»æ¢æ¶è´¹è
æ¶è´¹
pthread_mutex_t mutex; // äºæ¥ä¿¡å·éï¼ ä¸æ¬¡åªæä¸ä¸ªçº¿ç¨è®¿é®ç¼å²
int product_id = 0; //ç产è
id
int prochase_id = 0; //æ¶è´¹è
id
/* æå°ç¼å²æ
åµ */
void print()
{
int i;
for(i = 0; i < M; i++)
printf("%d ", buff[i]);
printf("\n");
}
/* ç产è
æ¹æ³ */
void *product()
{
int id = ++product_id;
while(1)
{
// ç¨sleepçæ°éå¯ä»¥è°èç产åæ¶è´¹çé度ï¼ä¾¿äºè§å¯
sleep(1);
//sleep(1);
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
in = in % M;
printf("product%d in %d. like: \t", id, in);
buff[in] = 1;
print();
++in;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
}
/* æ¶è´¹è
æ¹æ³ */
void *prochase()
{
int id = ++prochase_id;
while(1)
{
// ç¨sleepçæ°éå¯ä»¥è°èç产åæ¶è´¹çé度ï¼ä¾¿äºè§å¯
sleep(1);
//sleep(1);
sem_wait(&full_sem);
pthread_mutex_lock(&mutex);
out = out % M;
printf("prochase%d in %d. like: \t", id, out);
buff[out] = 0;
print();
++out;
pthread_mutex_unlock(&mutex);
sem_post(&empty_sem);
}
}
int main()
{
pthread_t id1[N];
pthread_t id2[N];
int i;
int ret[N];
// åå§ååæ¥ä¿¡å·é
int ini1 = sem_init(&empty_sem, 0, M);
int ini2 = sem_init(&full_sem, 0, 0);
if(ini1 && ini2 != 0)
{
printf("sem init failed \n");
exit(1);
}
//åå§åäºæ¥ä¿¡å·é
int ini3 = pthread_mutex_init(&mutex, NULL);
if(ini3 != 0)
{
printf("mutex init failed \n");
exit(1);
}
// å建N个ç产è
线ç¨
for(i = 0; i < N; i++)
{
ret[i] =
pthread_create(&id1[i], NULL, product, (void *)(&i));
if(ret[i] != 0)
{
printf("product%d creation failed \n", i);
exit(1);
}
}
//å建N个æ¶è´¹è
线ç¨
for(i = 0; i < N; i++)
{
ret[i] = pthread_create(&id2[i], NULL, prochase, NULL);
if(ret[i] != 0)
{
printf("prochase%d creation failed \n", i);
exit(1);
}
}
//éæ¯çº¿ç¨
for(i = 0; i < N; i++)
{
pthread_join(id1[i],NULL);
pthread_join(id2[i],NULL);
}
exit(0);
}
å¨Linuxä¸ç¼è¯çæ¶åï¼è¦å¨ç¼è¯å½ä»¤ä¸å å
¥é项-lpthread以å
å«å¤çº¿ç¨æ¯æãæ¯å¦åå¨çCæ件为demo.c,è¦çæçå¯æ§è¡æ件为demoãå¯ä»¥ä½¿ç¨å½ä»¤ï¼
gcc demo.c -o demo -lpthread
ç¨åºä¸ä¸ºä¾¿äºè§å¯ï¼ä½¿ç¨äºsleep(1);æ¥æåè¿è¡ï¼æ以æ¥çè¾åºçæ¶åå¯ä»¥çå°ï¼è¾åºæ¯æ¯ç§æå°ä¸æ¬¡çã