标题:semaphore


信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

 

Windows中用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。

线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。

下面是一个使用Semaphore信号量的例子:

 

HANDLE        gSamephore;

char               gArray[256];

 

void InitializeArray()

{

   for(int i = 0;i<256;i++)

   {

         gArray[i] = ‘I’;

   }

}

 

UINT ThreadProc1(LPVOID pParam)

{

  WaitForSingleObject(gSemaphore, INFINITE);

   for(int i = 0;i<256;i++)

   {

          global_Array[i]=’O’;

          Sleep(10);

   }

   ReleaseSemaphore(gSemaphore, 1, NULL);

   return 0;

}

 

UINT ThreadProc2(LPVOID pParam)

{

   WaitForSingleObject(gSemaphore, INFINITE);

   for(int i = 0;i<256;i++)

   {

         gArray[i]=’T’;

         Sleep(10);

   }

   ReleaseSemaphore(gSemaphore, 1, NULL);

   return 0;

 }

 

int main(int argc, char *argv[])

{

 

   //设置信号量 2 个资源,同时只可以有两个线程访问

   gSemaphore= CreateSemaphore(NULL, 2, 2, NULL);

 

hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);

     hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

 

     CloseHandle(hThread1);

     CloseHandle(hThread2);

 

     Sleep(4000);

     CloseHandle(gSemaphore);

 

}



看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注