PV操作

int Semaphore_Acquire(int semID)
{ struct Kernel_Thread *current=g_currentThread;
  struct Semaphore *s;
  int i;
  s=Get_Front_Of_Semaphore_List(&s_SemaphoreList);
  while(s!=0)
  { if(s->semaphoreID==semID)
               { for(i=0;iregisteredThreadCount;++i)
                       {if(s->registeredThreads[i]==current)
                          {         s->value--;
                            if(s->value<0)Wait(&s->waitingThreads);
                           
                            return 0;
                           }
                        }
                 if(i==s->registeredThreadCount)return -1;
               }
    s=Get_Next_In_Semaphore_List(s);
   }
 return -1;
} 

int Semaphore_Release(int semID)
{ struct Kernel_Thread *current=g_currentThread;
  struct Semaphore *s;
  int i;
  s=Get_Front_Of_Semaphore_List(&s_SemaphoreList);
  while(s!=0)
  { if(s->semaphoreID==semID)
               { for(i=0;iregisteredThreadCount;++i)
                       {if(s->registeredThreads[i]==current)
                          {        s->value++;
                            if(s->value<=0)Wake_Up_One(&s->waitingThreads);

                            return 0;
                           }
                        }
                 if(i==s->registeredThreadCount)return -1;
               }
    s=Get_Next_In_Semaphore_List(s);
   }
  return -1;
} 

你可能感兴趣的:(PV操作)