rMutex = CreateMutex(NULL,FALSE,TEXT("rmutex"));
时间: 2024-01-24 22:19:03 浏览: 58
这段代码是在Windows平台下创建一个互斥量,用于实现多线程中的资源访问控制。函数CreateMutex的第一个参数指定了一个安全描述符,一般传入NULL表示使用默认安全描述符;第二个参数指定了初始的互斥量状态,FALSE表示未锁定状态;第三个参数是一个指向互斥量名称的字符串,用于在系统中唯一标识这个互斥量,其他线程可以通过这个名称来打开同一个互斥量。如果创建成功,CreateMutex函数会返回一个互斥量的句柄,否则返回NULL。
相关问题
#include "windows.h" #include "conio.h" #include "stdio.h" int readcount=0; //读者进程数量 HANDLE rMutex=NULL; //读者互信号量 HANDLE wMutex=NULL; //写者互斥信号量 void Readers() //读者函数 { while(1) { printf("%d 请等待读者。。。\n",GetCurrentThreadId()); WaitForSingleObject(rMutex,INFINITE);//P(r) //第一个读,要等已经在写的写者写完才可以开始读 if(readcount==0){ WaitForSingleObject(wMutex,INFINITE); //P(w) } readcount++; ReleaseMutex(rMutex);//V(r) printf("%d 正在读书。。。请等待1.3秒\n",GetCurrentThreadId()); Sleep(1300); printf("%d 读书结束\n",GetCurrentThreadId()); WaitForSingleObject(rMutex,INFINITE);//P(r) readcount--; printf("读者数量:%d\n",readcount); if(readcount==0){ printf("全部读者结束阅读\n\n"); ReleaseMutex(wMutex); //V(w) } ReleaseMutex(rMutex);//V(r) } } void Writer()//写者函数 { while(1) { printf("\n%d 请等待写者。。。\n",GetCurrentThreadId()); WaitForSingleObject(wMutex,INFINITE);//P(r) printf("写者正在写书!等待 2 秒!\n"); Sleep(2000); ReleaseMutex(wMutex); } } HANDLE ahThread; HANDLE bhThread; HANDLE hThread; int tStop() //停止函数 { int l=getchar(); printf("%d",l); return l; } void Start() //开始函数 { bhThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Readers,NULL,0,NULL); ahThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Writer,NULL,0,NULL); hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)tStop,NULL,0,NULL); //多线程 int IsStop=tStop(); if(IsStop==0) //满足停止条件 { CloseHandle(ahThread); CloseHandle(bhThread); CloseHandle(hThread); } } int main() //主函数 { rMutex = CreateMutex(NULL,FALSE,TEXT("rmutex")); wMutex = CreateMutex(NULL,FALSE,TEXT("wmutex")); Start(); //开始 printf("\n"); return 0; }
此代码实现了经典的读者-写者问题。其中,读者和写者是多个线程,它们需要对共享资源进行访问。为了保证数据的一致性和正确性,需要使用互斥信号量来控制读者和写者之间的访问。
具体地,读者需要先申请读者互斥信号量,如果此时没有写者在写,则可以开始读取共享资源。如果此时有写者在写,则需要等待写者写完再开始读取。读取完后需要释放读者互斥信号量。写者需要先申请写者互斥信号量,如果此时没有读者正在读,则可以开始写入共享资源。如果此时有读者正在读,则需要等待读者读完再开始写入。写入完后需要释放写者互斥信号量。
此代码中还包含了一个停止函数和一个开始函数,可以通过输入的方式控制程序的开始和停止。同时,使用了多线程技术来实现读者和写者的并发执行。
需要注意的是,此代码中存在死锁的可能性。当读者数量和写者数量都很多时,可能会出现读者和写者相互等待的情况,导致程序无法继续执行。因此,在实际应用中需要根据具体情况进行优化。
HANDLE hMutex = CreateMutex(NULL, FALSE, "MutexToProtectCriticalResource");
在Windows操作系统中,`HANDLE`是处理各种系统资源的通用指针类型,包括互斥量(Mutex)。`CreateMutex`函数用于创建一个新的互斥量对象,其参数解释如下:
1. `NULL`:通常用于指示默认权限,即读取和写入权限。如果不希望用户直接访问,可以传入一个非空的安全描述符来控制权限。
2. `FALSE`:表示初始状态为未锁定。这意味着互斥量创建后是可获取的,其他线程可以尝试获取该锁。
3. `"MutexToProtectCriticalResource"`:这是一个字符串常量,作为互斥量的名称。当你有多个互斥量时,这个名字可以帮助识别特定的资源,例如"保护关键资源的互斥量"。
创建这样的互斥量后,可以通过`WaitForSingleObject(hMutex, ...)`来尝试获取锁。如果互斥量已被其他线程持有,当前线程将被阻塞直到锁可用。一旦获得锁,就可以执行需要保护的关键资源操作,完成后再调用`ReleaseMutex(hMutex)`释放锁,允许其他线程进入。
举个例子:
```c++
// 创建一个名为"CriticalSection"的互斥量
HANDLE hMutex = CreateMutex(NULL, FALSE, "CriticalSection");
// 线程A尝试获取锁
if (WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0) {
// 锁已获取,可以修改共享资源
// ...
ReleaseMutex(hMutex); // 任务完成后释放锁
} else {
// 锁已被其他线程占用,线程A继续等待
}
```
阅读全文