信号量Semaphore

信号量Semaphore

     VC声明

HANDLE CreateSemaphore(
    LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, // SD
    LONGlInitialCount, // initial count
    LONGlMaximumCount, // maximum count
    LPCTSTRlpName// object name
);
作用:创建一个新的信号量
返回值
Long,如执行成功,返回信号量对象的句柄;零表示出错。会设置GetLastError。即使返回一个有效的句柄,但倘若它指出同名的一个信号量已经存在,那么GetLastError也会返回ERROR_ALREADY_EXISTS

参数
lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了信号量的安全特性
lInitialCount Long,设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
lMaximumCount Long,设置信号量的最大计数
lpName String,指定信号量对象的名称。用vbNullString可创建一个未命名的信号量对象。如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符


下面举个例子
       hSemah1 =CreateSemaphore(0,1,1,_T("Test")); //创建信号量,初始值为1(发出信号),最多一个线程可用,信号量名字Test
       hSemah2 =CreateSemaphore(0,0,1,_T("Test")); //创建信号量,初始值为0(不能发出信号),最多一个线程可用,信号量名字Test

        //创建两个线程
HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,this,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,this,0,NULL);

 DWORD  CTest_SemaphoreDlg::Thread1(LPVOID lparam)
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;


while(1)
{


WaitForSingleObject(pDlg->hSemah1,INFINITE);


TRACE(_T("%d\n"),1);


ReleaseSemaphore(pDlg->hSemah1,1,NULL);
}


return 0;
}


DWORD  CTest_SemaphoreDlg::Thread2(LPVOID lparam)
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;


while(1)
{


WaitForSingleObject(pDlg->hSemah2,INFINITE);


TRACE(_T("%d\n"),2);


ReleaseSemaphore(pDlg->hSemah2,1,NULL);
}


return 0;
}

程序执行的时候线程1中等待的信号量hSemah1初始值为1,触发wait,执行完成后ReleaseSemaphore会把hSemah1重新置为1,这样线程2就有了执行的机会,因为hSemah1,hSemah2为同名信号量指向的是同一信号量。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值