查看:2540|回复:0
linux多线程问题,linux如何使用信号量的例子分析发表时间:2013-01-07 21:42:39

洗心、革面。

0分享0主题0帖子

学徒一级

(初出茅庐)

  信号量本质上是一个非负的整数计数器。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本。下面逐个介绍和信号量有关的一些函数,它们都在头文件/usr/include/semaphore.h中定义。

  信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:

  extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));

  sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。

  函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不再阻塞,选择机制同样是由线程的调度策略决定的。

  函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。

  函数sem_destroy(sem_t *sem)用来释放信号量sem。

  下面来看一个使用信号量的例子。在这个例子中,一共有4个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)。

  /* File sem.c */

  #include

  #include

  #include

  #define MAXSTACK 100

  int stack[MAXSTACK][2];

  int size=0;

  sem_t sem;

  /* 从文件1.dat读取数据,每读一次,信号量加一*/

  void ReadData1(void){

  FILE *fp=fopen("1.dat","r");

  while(!feof(fp)){

  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);

  sem_post(&sem);

  ++size;

  }

  fclose(fp);

  }

  /*从文件2.dat读取数据*/

  void ReadData2(void){

  FILE *fp=fopen("2.dat","r");

  while(!feof(fp)){

  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);

  sem_post(&sem);

  ++size;

  }

  fclose(fp);

  }

  /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/

  void HandleData1(void){

  while(1){

  sem_wait(&sem);

  printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],

  stack[size][0]+stack[size][1]);

您需要登录以后才可以回帖    登录|注册