信号量Semaphore

可以允许N个线程在同一时间访问同一资源

 

相关API函数:

 

创建信号量:

CreateSemaphore();

HANDLE CreateSemaphore(
    LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性,NULL为默认
    LONG lInitialCount, // 信号量初始值,要>=0且<=第三个参数
    LONG lMaximumCount, // 信号量最大值
    LPCT STRlpName// 信号量名称
);

函数调用成功返回句柄,如果创建的信号量和已有的信号量重名,那么返回已经存在的信号量句柄,失败返回NULL

 

对指定信号量增加指定的值

 

ReleaseSemaphore();

BOOL ReleaseSemaphore(
HANDLE hSemaphore,  //信号量句柄
LONG lReleaseCount, //信号量对象在当前基础上要增加的值
LPLONG lpPreviousCount //指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL
);

 函数成功返回TRUE

 

 

 

利用Semaphore可以实现进程只有一个实例。

有的程序不允许运行同一个程序的多个实例(例如以独占方式使用串行口,端口等)。

这就引出了进程互斥的问题,Semaphore实现进程互斥的方法:

进程在第一次启动时成功创建名为Semaphore实例,此后进程实例第二次创建GetLastError会返回ERROR_ALREADY_EXISTS,从而保证进程在系统中只能存在一个实例

//创建互斥量
HANDLE hSemaphore=CreateSemaphore(NULL,3,3,"sample");
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
  //如果已有互斥量存在则释放句柄
CloseHandle(hSemaphore);
return FALSE;
}

 

posted @ 2020-04-18 15:19  坦坦荡荡  阅读(254)  评论(0编辑  收藏  举报