createmutex函数参数含义,createmutex函数用法
处理hMutex
hMutex=:CreateMutex(NULL,FALSE,NULL);
WaitForSingleObject(hMutex,INFINITE);//1
WaitForSingleObject(hMutex,INFINITE);//2
很多初学者认为设置为FALSE就意味着收不到信号。其实这是不对的。
真正的理解是:
CreateMutex()函数的第二个参数是FALSE,这意味着刚刚创建的互斥体不属于任何线程。
也就是没有线程拥有他。当没有线程拥有他的时候,一个互斥体是处于兴奋状态,所以它是处于信号状态。
调用:waitforsingleobject (hmutex,infinite)时;//1
当这个线程得到互斥体时,互斥体从有信号变为无信号。
调用:ReleaseMutex()就是把互斥体变成一个信号。
等待线程结束
功能原型是:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dw milliseconds);
HHandle是被监控对象的句柄(通常是同步对象或线程);
dwMilliseconds为hHandle对象设置的超时值,以毫秒为单位。
当函数在线程中被调用时,线程被暂时挂起,系统监控hHandle所指向的对象的状态。如果线程正在等待的对象在挂起的dwMilliseconds的毫秒内变为信号状态,函数将立即返回;如果超时已经达到dw毫秒,但是hHandle指向的对象还没有变成信号状态,函数还是会返回。参数dwMilliseconds有两个特殊值:0和INFINITE。如果为0,函数立即返回;如果为INFINITE,线程将被挂起,直到hHandle指向的对象变为信号状态。
于是第一个:WaitForSingleObject()函数返回,释放线程对互斥体的所有权,互斥体又会变成激发态,导致第二个:WaitForSingleObject()函数返回!
主要区别
创建事件
和
创建互斥体
不同之处。Mutex是互斥体,event用于事件通知。
因为Mutex中的ReleaseMutex是这样设置的,没有线程拥有它,有信号;事件中的resetevent设置为无信号。
奎哥哥:
互斥体就是互斥体,一般用在一个程序只允许系统中有一个实例的时候。程序一启动,就会检测到这个互斥体。如果它显示程序已经在运行,它就退出。否则,它拥有这个互斥体并继续运行程序。
事件一般用于通知,比如某件事做好了通知另一个线程,这里的另一个线程一般都在等待这个事件。
互斥体保护关键部分。当然,你可以用它来等待事件,但是语义不同。
它是流程的一个实例。比如记事本(假设),第一个记事本启动时没有创建互斥体,所以第一个记事本程序创建并拥有互斥体,然后显示UI。然后当第二个记事本启动时,发现互斥体已经存在,说明记事本已经在运行了,所以第二个记事本直接退出。这确保了系统中只有一个实例。