Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534824
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2014-12-22 11:00:37

当不需要使用有名信号量关联的名字时,可改用基于内存的信号量。基于内存的信号量至少具有随进程的持续性,然而他们真正的持续性却取决于存放信号量的内存区的类型。只要含有某个基于内存信号量的内存区保持有效,该信号量就一直存在。
1.如果某个基于内存的信号量是由单个进程内的各个线程共享的(sem_init函数的入参shared为0),那么该信号量具有随进程的持续性,当该进程终止时它也就消失了。
2.如果某个基于内存的信号量是在不同进程间共享的(sem_init函数的入参shared为1),那么该信号量必须存放在共享内存中,因而只要共享内存区仍然存在,该信号量就一直存在。POSIX共享内存区和system V共享内存区都具有随内核的持续性。这意味着服务器可以创建一个共享内存区,在该共享内存区中初始化一个Posix基于内存的信号量,然后终止。一段时间后,一个或多个客户可打开该共享内存区,访问该信号量。

sem_t mysem;

sem_init(&mysem,1,0);

if(fork() == 0) {
   ......
    sem_post(&mysem);
}
sem_wait(&mysem);

以上例子中虽然sem_init函数的shared置为1,表示进程间的内存信号量,但是由于mysem信号量并不存在于共享内存中,所以这个例子中的信号量实际是不能在父子进程间使用的。fork出来的子进程通常不共享父进程的内存空间。子进程是在父进程内存空间的副本上启动的,它跟共享内存区不是一回事。

posix内存信号量的生产者和消费者例子:

点击(此处)折叠或打开

  1. #include "../unipc.h"

  2. #define NBUFF 10
  3. #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
  4. int nitems;

  5. struct {
  6.     int buff[NBUFF];
  7.     sem_t mutex,nempty,nstored;
  8. } shared;

  9. void *produce(void *arg)
  10. {
  11.     int i;
  12.     for(i = 0;i < nitems; i++) {
  13.         sem_wait(&shared.nempty);
  14.         sem_wait(&shared.mutex);
  15.         shared.buff[i%NBUFF] = i;
  16.         sem_post(&shared.mutex);
  17.         sem_post(&shared.nstored);
  18.     }
  19.     return NULL;
  20. }

  21. void *consume(void *arg)
  22. {
  23.     int i;
  24.     for(i = 0;i < nitems; i++) {
  25.         sem_wait(&shared.nstored);
  26.         sem_wait(&shared.mutex);
  27.         if(i != shared.buff[i%NBUFF]) {
  28.             printf("i = %d,buff[%d]=%d\n",i,i,shared.buff[i]);
  29.         }
  30.         sem_post(&shared.mutex);
  31.         sem_post(&shared.nempty);
  32.     }
  33.     return NULL;
  34. }

  35. int main(int argc ,char *argv[])
  36. {
  37.     int nitems;
  38.     pthread_t ptid_produce,ptid_consume;

  39.     if(argc != 2 ) {
  40.         printf("usage produce1 <#items>\n");
  41.         return -1;
  42.     }
  43.     nitems = atoi(argv[1]);

  44.     sem_init(&shared.mutex,0,1);
  45.     sem_init(&shared.nempty,0,NBUFF);
  46.     sem_init(&shared.nstored,0,0);

  47.     pthread_create(&ptid_produce,NULL,produce,NULL);
  48.     pthread_create(&ptid_consume,NULL,consume,NULL);

  49.     pthread_join(ptid_produce,NULL);
  50.     pthread_join(ptid_consume,NULL);

  51.     sem_destroy(&shared.mutex);
  52.     sem_destroy(&shared.nempty);
  53.     sem_destroy(&shared.nstored);
  54.     return 0;
  55. }

阅读(1114) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~