大家好,欢迎来到IT知识分享网。
互斥量内核对象 Mutex |
适用于线程和进程间同步 |
互斥量内核对象能够确保一个进程独占对一个资源的访问。互斥量与关键段(线程同步方式)的行为完全相同,当互斥量是内核对象,而关键段是用户模式下的的同步对象 |
互斥量对象包含: 一个线程 ID ,使用计数和递归计数 。线程 ID 表示当前占用该互斥量的线程 ID ,递归计数表示该线程占用互斥量的次数,使用计数表示使用互斥量对象的不同线程的个数 |
互斥量规则:1.线程ID为0,则该互斥量不为任何线程占用,处于触发状态 2线程ID非零,则该互斥量被一个线程占用,处于非触发状态 |
CreateMutex()
lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 。 bInitialOwner:控制互斥量的初始状态,一般设置为 false ,是互斥量的线程 ID 和递归计数都设为 0 ,表示互斥量不被任何进程占用,处于触发状态,其他进程可以进行调用等待函数,获得该互斥量对象,获得对同步资源的占用。如果初始值设为true ,互斥量的线程 ID 设置为当前线程,递归计数设为 1 ,表示当前线程占用互斥量对象,拥有对同步资源的独占,互斥量处于未触发状态 lpName ,指向互斥对象名的指针,设置互斥对象的名字。创建一个未命名的互斥体对象。如已经存在这个名字,则打开已命名互斥体 。有了名字就可以跨进程得到同一把锁。即进程写名字,线程为null 如:HANDLE hNutex = CreateMutex(NULL, FALSE, L”Local\\eee”); //创建本地内核对象 |
等待函数在等待互斥量内核对象时,会进行互斥量的线程ID 是否为 0 ,如果为非 0 ,表示互斥量处于未触发状态,等待函数会被阻塞。当另外一个线程将互斥量释放,使其线程 ID 为 0 时,系统会唤醒阻塞的等待函数,把互斥量的线程 ID 设置为它的线程 ID ,使其成为可调度状态 ,递归计数加1,从而该线程占用了互斥量,使其他线程无法执行下去。 |
openMutex():
dwDesiredAccess: MUTEX_ALL_ACCESS 请求对互斥体的完全访问 MUTEX_MODIFY_STATE 允许使用 ReleaseMutex 函数 SYNCHRONIZE 允许互斥体对象同步使用 bInheritHandle : 如希望子进程能够继承句柄,则为TRUE lpName :要打开对象的名字 返回值:如执行成功,返回对象的句柄;零表示失败。若想获得更多错误信息,请调用GetLastError函数 |
ReleaseMutex()当一个线程访问完通过互斥量对象获得的独占资源后,应该调用ReleaseMutex,递归计数减1. |
CloseHandle()传入的句柄有效,系统将获得内核对象数据结构的地址,并将结构中的使用计数减1 ,如果使用计数 0 ,就会将内核对象销毁,从内存空间中擦除 |
static HANDLE st_handleMutex = CreateMutex(NULL,TRUE,NULL);//TRUE 表示绑定当前创建的线程,未触发,递归次数变1
bool CreateThreadMutex()
{
DWORD dwThreadId;
HANDLE HThread;
DWORD dwMainID = GetCurrentThreadId();
HThread = CreateThread(NULL, 0, MutexThread, &dwMainID, CREATE_SUSPENDED, &dwThreadId);
ResumeThread(HThread);
Sleep(5000);
ReleaseMutex(st_handleMutex);//变触发状态,递归次数减1.
WaitForSingleObject(HThread, INFINITE);
CloseHandle(HThread);
qDebug() << "CreateThreadMutex quit!";
return true;
}
DWORD WINAPI MutexThread(LPVOID lp)
{
while (WaitForSingleObject(st_handleMutex, 1000) != WAIT_OBJECT_0)
{
qDebug() << "MutexThread is running!";
}
//要是等待函数发现互斥量处于触发状态,返回WAIT_OBJECT_0,那么互斥量变未触发状态,递归次数为1.
Sleep(2000);
qDebug() << "MutexThread quit!";
return 0;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22116.html