对 thread.semaphore 中的一段源码有疑惑,请指教
By
terrorist
at 2022-01-12 • 0人收藏 • 784人看过
this.handle = CreateSemaphore(null,initCount,max,semaphoreName); if(! this.handle ) { if( targ1== "string") { this.handle = OpenSemaphore( 0x1F0003/*_EVENT_ALL_ACCESS*/,false ,semaphoreName); if( this.handle ) this.conflict = "信号量已存在"; } }
为什么 CreateSemaphore 失败后还要 OpenSemaphore ?
3 个回复 | 最后更新于 2022-01-06
根据 https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createsemaphorea
CreateSemaphore 的返回值有三种情况:
1 如果函数成功,返回值是一个指向semaphore对象的句柄。
2 如果在调用该函数之前,命名的信号灯对象已经存在,该函数将返回一个指向现有对象的句柄,并且GetLastError返回ERROR_ALREADY_EXISTS
3 如果该函数失败,返回值为NULL。要获得扩展的错误信息,请调用GetLastError。
同名的semaphoreName信号量已存在也不会返回 NULL
if( !max || max <=0 ) error("@参数2 最大计数值必须大于0"); if(initCount <= 0) error("@参数3 初始计数值必须大于0"); elseif(initCount > max) error("@参数3 初始计数值不能大于最大计数值"); elseif(initCount === null) initCount = max; if(targ1 == "string"){ // 尝试打开 this.handle = OpenSemaphore(0x1F0003/*_EVENT_ALL_ACCESS*/, false, semaphoreName); if(this.handle){ this.conflict = "信号量已存在" } else { this.handle = CreateSemaphore(null, initCount, max, semaphoreName); if(this.handle){ this.handle = OpenSemaphore(0x1F0003/*_EVENT_ALL_ACCESS*/, false, semaphoreName); } } } elseif(targ1 === null){ this.handle = CreateSemaphore(null, initCount, max, null); } if(!this.handle) return null, ..lasterr() ..table.gc( this,"close" );
这是修改版
登录后方可回帖
CreateSemaphore失败的原因有许多种,其中一种是同名的semaphoreName信号量已存在, OpenSemaphore 就是检验是不是这个原因