多线程程序设计---pthread库、信号量的使用

现有4个线程R1,R2,W1和W2,它们共享可以存放一个数的缓冲器B。线程R1每次把从键盘上读入的一个数存放到缓冲器B中,供线程W1打印输出;线程R2每次从磁盘上读一个数放到缓冲器B中,供线程W2打印输出。当一个线程把数据存放到缓冲器后,在该数还没有被打印输出之前不准任何线程再向缓冲器中存数。在缓冲器中还没有存入一个新的数之前不允许任何线程加快从缓冲区中取出打印。编写程序,采用互斥锁或信号量机制使这4个线程并发执行协调工作。 提示,互斥锁和信号量定义如下:

  • 互斥锁S:表示能否把数存入缓冲器B,初始值为1。

  • 信号量S1:表示R1是否已向缓冲器存入从键盘上读入的一个数,初始值为0。信号量S2:表示R2是否已向缓冲器存入从磁盘上读入的一个数,初始值为0。

#include<pthread.h>
#include<stdio.h>
#include<semaphore.h>
#include<stdlib.h>
#include<unistd.h>
sem_t full,empty;
pthread_mutex_t mutex;
int num;
void *R(void *arg)
{
  sem_wait(&empty);
  pthread_mutex_lock(&mutex);
  printf("R input number :-------");
  scanf("%d",&num);
  pthread_mutex_unlock(&mutex);
  sem_post(&full);
}
void *W(void *arg)
{
  sem_wait(&full);
  pthread_mutex_lock(&mutex);
  printf("W output number :--------%d\n",num);
  pthread_mutex_unlock(&mutex);
  sem_post(&empty);
}
int main(int argc,char *argv[])
{
  pthread_t R1,R2;
  pthread_t W1,W2;
  sem_init(&full,0,0);
  sem_init(&empty,0,1);
  pthread_mutex_init(&mutex,NULL);
  int a=1,b=1;
  pthread_create(&R1,NULL,R,&a);
  pthread_create(&R2,NULL,R,&b);
  pthread_create(&W1,NULL,W,&a);
  pthread_create(&W2,NULL,W,&b);
  pthread_join(R1,NULL);
  pthread_join(R2,NULL);
  pthread_join(W1,NULL);
  pthread_join(W2,NULL);
  pthread_mutex_destroy(&mutex);
  sem_destroy(&full);
  sem_destroy(&empty);
  return 0;
}

运行结果:


版权声明:本文为Gabrielle_OyO原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。