Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2093408
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: C/C++

2011-09-30 17:53:11

1. sem_sync.h

  1. #ifndef _SEM_SYNC_H_
  2. #define _SEM_SYNC_H_
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <stdio.h>
  7. #include <semaphore.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11.   
  12. char SEM_A_TASK_IS_FREE[]= "a_task_is_free";
  13. char SEM_B_TASK_IS_FREE[]= "b_task_is_free";

  14. #endif

进程a 

  1. #include "sem_sync.h"

  2. int main()
  3. {
  4.     sem_t *sem_a_task_is_free;
  5.     sem_t *sem_b_task_is_free;
  6.     int val;

  7.     sem_a_task_is_free = sem_open(SEM_A_TASK_IS_FREE, O_CREAT, 0644, 1);
  8.     sem_b_task_is_free = sem_open(SEM_B_TASK_IS_FREE, O_CREAT, 0644, 0);
  9.     if (sem_a_task_is_free == SEM_FAILED || sem_b_task_is_free == SEM_FAILED)
  10.     {
  11.         perror("unable to create semaphore");
  12.         sem_unlink(SEM_A_TASK_IS_FREE);
  13.         exit(-1);
  14.     }

  15.     //while (1 == 1)
  16.     {
  17.         printf("run a task......\n");
  18.         getchar();

  19.         sem_getvalue(sem_a_task_is_free, &val);
  20.         printf("The sem is %d\n", val);
  21.         sem_post(sem_a_task_is_free);
  22.         sem_getvalue(sem_a_task_is_free, &val);
  23.         printf("The sem after sem post is %d\n", val);
  24.         printf("send->a_task_is_free\n");
  25.         
  26.         printf("\nwaite sem_b_task_is_free\n");
  27.         //sem_wait(sem_b_task_is_free);
  28.         printf("recv<-sem_b_task_is_free\n");
  29.     }

  30.     sem_close(sem_a_task_is_free);
  31.     sem_unlink(SEM_A_TASK_IS_FREE);

  32.     _exit(0);
  33. }

//gcc a.c -lpthread  -o a

 

进程b 

  1. #include "sem_sync.h"

  2. int main()
  3. {
  4.     int val;
  5.     sem_t *sem_a_task_is_free;
  6.     sem_t *sem_b_task_is_free;

  7.     sem_a_task_is_free = sem_open(SEM_A_TASK_IS_FREE, O_CREAT, 0644, 0);
  8.     sem_b_task_is_free = sem_open(SEM_B_TASK_IS_FREE, O_CREAT, 0644, 1);
  9.     if (sem_a_task_is_free == SEM_FAILED || sem_b_task_is_free == SEM_FAILED)
  10.     {
  11.         perror("unable to create semaphore");
  12.         sem_unlink(SEM_B_TASK_IS_FREE);
  13.         exit(-1);
  14.     }

  15.     //while (1 == 1)
  16.     {
  17.         printf("\nrun b_task......\n");
  18.         sem_getvalue(sem_a_task_is_free, &val);
  19.         printf("The sem is %d\n", val);
  20.         sleep(1);
  21.         //sem_post(sem_b_task_is_free);
  22.         printf("send->sem_b_task_is_free\n");
  23.         printf("\nwaite a_task_is_free\n");
  24.         sem_getvalue(sem_a_task_is_free, &val);
  25.         printf("The sem 2 is %d\n", val);
  26.         sem_wait(sem_a_task_is_free);
  27.         sem_getvalue(sem_a_task_is_free, &val);
  28.         printf("The sem 3 is %d\n", val);
  29.         printf("recv<-a_task_is_free\n");
  30.     }

  31.     sem_close(sem_a_task_is_free);
  32.     sem_close(sem_b_task_is_free);

  33.     sem_unlink(SEM_B_TASK_IS_FREE);
  34.     exit(0);
  35. }

//gcc b.c -lpthread -o b

 

#./a

#./b

备注:只要信号量没有释放,sem_unlink,那信号量值将保持不变,sem_post将使信号量增加1,sem_wait将使信号量减1.

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