⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sem.c

📁 VxWork实时操作系统中信号量的使用汇总
💻 C
字号:
看到一个程序,   
    
  /*include*/   
  #include   "vxWorks.h"   
  #include   "taskLib.h"   
  #include   "semLib.h"   
  #include   "stdio.h"   
    
  /*function   prototype*/   
  void   taskOne(void);   
  void   taskTwo(void);   
    
  /*   global   */   
  #define   ITER   10   
  SEM_ID   semBinary;   
  int   global   =   0;   
    
  void   binary(void)   
  {   
          int   taskIdOne,   taskIdTwo;   
    
          /*   create   semphore   with   available   and   queue   tasks   on   FIFO   basis   */   
          semBinary   =   semBCreate(SEM_Q_FIFO,   SEM_FULL);   
    
          /*   ----------------NOTE   1--------------*/   
          semTake(semBinary,   WAIT_FOREVER);   
    
          /*   spawn   the   two   tasks   */   
          taskIdOne   =   taskSpawn("t1",   90,   0x100,   2000,   (FUNCPTR)taskOne,   0,0,0,0,0,0,0,0,0,0);   
          taskIdTwo   =   taskSpawn("t2",   90,   0x100,   2000,   (FUNCPTR)taskTwo,   0,0,0,0,0,0,0,0,0,0);   
  }   
    
  void   taskOne(void)   
  {   
          int   i;   
          for   (i=0;   i<ITER;   i++)   
          {   
  semTake(semBinary,   WAIT_FOREVER);   
                  /*     wait   indefinitely   for   semphore     */   
    
                    printf("   I   am   taskOne   and   global   =   %d   ...\n",   ++global);   
  semGive(semBinary);                                 /*     give   up   semphore     */   
          }   
  }   
    
  void   taskTwo(void)   
  {   
          int   i;   
    
          /*-------------NOTE   2--------------*/   
          semGive(semBinary);       /*   give   up   the   semphore   and   begin   the   switch   */   
            
          for   (i=0;   i<ITER;   i++)   
          {   
    semTake(semBinary,   WAIT_FOREVER);   
  printf("   I   am   taskTwo   and   global   =   %d   ----\n",   --lobal);   
  semGive(semBinary);                     /*   give   up   semphore   */   
          }   
  }   
    
  这个程序的结果自然是global在1和0之间变化,任务1和任务2不断切换。   
  但是如果删除上述程序中的注释NOTE1和NOTE2下面的两句,结果是什么呢?我觉得结果不变,但是运行结果是:任务1结束(也就是说循环10次,使得global增加到10),然后才是任务2,global从10减少到0.   
  我很不理解,任务1semGive之后,任务2应该可以取得信号呀!? 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -