DWORD WINAPI WaitForSingleObject( HANDLE hHandle, //要获取的锁的句柄 DWORD dwMilliseconds //超时间隔 ); 说明: WaitForSingleObject的作用是等待一个指定的对象(如Mutex对象),直到该对象处于非占用的状态 lpParameter; for (int i = 0; i < pThreadData->nMaxNum; ++ i) { //请求获得一个互斥量锁 WaitForSingleObject hThread2); //主线程的执行路径 for (int i = 0; i < 5; ++ i) { //请求获得一个互斥量锁 WaitForSingleObject hThread[i] = CreateThread(NULL, NULL, SaleTicket, &threadSale[i], 0, NULL); //请求获得一个互斥量锁 WaitForSingleObject
互斥对象的所有权为主线程所有,非空闲状态 Sleep(4000); return 0; } DWORD WINAPI ThreadProc1(LPVOID lpParameter) { //WaitForSingleObject (hMutex,INFINITE); //第二个参数为INFINITE表示一直等待,直到拥有互斥对象 while(TRUE) { WaitForSingleObject(hMutex,INFINITE /使用完了,将互斥对象还给操作系统 return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject
使用例子编辑 常用操作mutex的函数还有:ReleaseMutex/OpenMutex/WaitForSingleObject/WaitForMultipleObjects。 } while(1) { printf(“cplusplus_me\n”); } CloseHandle(m_hMutex); return 0;} WaitForSingleObject 函数的使用 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止 process.h>using namespace std; HANDLE hMutex; UINT __stdcall Add(LPVOID lParam){ DWORD dReturn = WaitForSingleObject end\n” << endl; ReleaseMutex(hMutex); return 1;} void Add3(LPVOID lParam){ DWORD dReturn = WaitForSingleObject
Microsoft Windows 平台中两种最常用的锁定方法为 WaitForSingleObject 和 EnterCriticalSection 。 WaitForSingleObject 是一个过载 Microsoft API ,可用于检查和修改许多不同对象(如事件、作业、互斥体、进程、信号、线程或计时器)的状态。 如果存在争用,则此 API 在内核中所采用的路径将与 WaitForSingleObject 极其相似。 在低争用的情况下,存在加速比 (WaitForSingleObject_Time / EnterCriticalSection_Time) 大约为 5 倍的性能之差。 在 2 个线程持续争用的情况下,使用 EnterCriticalSection 和使用 WaitForSingleObject 之间的差别最小。
最近我在开发一个串口通信程序时,遇到了一个棘手的同步问题:尽管数据量很小(最多100字节),但系统总是报出两个成对出现的超时错误:"WaitForSingleObject hAlreadyStopedEvent 线程调度延迟监听线程中使用:DWORD dwWaited = WaitForSingleObject(g_hToStopEvent, 100);这里的关键误解是:100ms不是精确的检测间隔,而是最大等待时间 优化等待机制// 监听线程改进DWORD dwAdaptiveWait = CalculateOptimalWaitTime(); // 动态计算等待时间DWORD dwWaited = WaitForSingleObject dwWaited == WAIT_OBJECT_0) { SetEvent(g_hAlreadyStopedEvent); // 缩短恢复等待时间,添加超时处理 dwWaited = WaitForSingleObject int i = 0; i < 3; i++) { // 最多重试3次 SetEvent(g_hToStopEvent); DWORD dwWaited = WaitForSingleObject
一、第二个参数(超时时间)的影响DWORD result = WaitForSingleObject(hHandle, 1000);中的第二个参数1000表示等待超时时间为1000毫秒(1秒),其核心影响如下 自动重置事件(Auto-reset Event)的特性自动重置机制:当WaitForSingleObject返回WAIT_OBJECT_0时,系统会自动将事件重置为无信号状态信号丢失场景: // 线程 A: 触发事件 SetEvent(hEvent); // 事件变为有信号 SetEvent(hEvent); // 第二次触发可能被丢失 // 线程B: 等待事件 WaitForSingleObject 超时期间外的信号触发若信号在等待开始前或超时后触发,当前WaitForSingleObject调用无法捕获示例时序: t0: 线程开始等待(超时1秒) t1: 1秒超时,返回WAIT_TIMEOUT result = WaitForSingleObject(hEvent, 1000);if (result == WAIT_FAILED) { DWORD err = GetLastError(
Windows系统提供了丰富的内核对象和同步函数,其中WaitForSingleObject作为最基础也最常用的同步函数,承担着"线程等待"的核心职责。 本文将从函数定义、工作原理到高级应用,全面解析WaitForSingleObject的使用方法与注意事项,帮助开发者掌握Windows同步编程的精髓。 一、函数定义与核心参数解析1.1 函数原型WaitForSingleObject是Windows API中的一个同步函数,定义如下:DWORD WINAPI WaitForSingleObject( \n"); // 等待事件被触发,最多等待5秒 DWORD result = WaitForSingleObject(g_hEvent, 5000); if (result 七、总结与扩展阅读WaitForSingleObject作为Windows同步编程的基础函数,其核心价值在于提供了一种高效的线程等待机制。
最后解决的方法是: 使用CreateMutex创建一种资源,然后在进入进程的时候WaitForSingleObject,等待此资源被分配到本进程,否则等待,最后进程的功能实现了再ReleaseMutex while (true) { ....... //********************************************************* WaitForSingleObject
生产者的算法, WaitForSingleObject(hEmpty, INFINITE); WaitForSingleObject(hMutex, INIFINITE); /* produce new resources */ ReleaseMutex(hMutex); ReleaseSemaphore(hFull, 1, NULL); 消费者的算法, WaitForSingleObject (hFull, INFINITE); WaitForSingleObject(hMutex, INIFINITE); /* consume old resources */ ReleaseMutex = pQueue->threadId) return; WaitForSingleObject(pQueue->hEmpty, INFINITE); WaitForSingleObject = msg); WaitForSingleObject(pQueue->hFull, INFINITE); WaitForSingleObject(pQueue->hMutex
(NULL, FALSE, "lyshark"); CloseHandle(hThread); for (int x = 0; x < 10; x++) { // 请求获得一个互斥锁 WaitForSingleObject (hThreadA, INFINITE); WaitForSingleObject(hThreadA, INFINITE); // 销毁两个线程函数 CloseHandle(SemaphoreOne 执行WaitForSingleObject(semTwo, INFINITE);会让线程函数进入类似挂起的状态,当接到ReleaseSemaphore(semOne, 1, NULL);才会恢复执行。 (hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); CloseHandle(semOne); CloseHandle(semTwo (hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); //non-signaled 如果不更改,对象继续停留在signaled
(a, b) \ WaitForSingleObject_stub((void*)a, NORMAL_LOCK_TYPE) #define EnterCriticalSection (a) \ WaitForSingleObject_stub((void*)a, CRITICAL_SECTION_TYPE) #define ReleaseMutex(a (void* hLock, int type) { /* step 1 */ WaitForSingleObject(hDbgLock); /* check if */ ReleaseMutex(hDbgLock); /* step 2 */ if(NORMAL_LOCK_TYPE == type) WaitForSingleObject void ReleaseLock_stub(void* hLock, int type) { /* step 1 */ WaitForSingleObject(hDbgLock
<<endl; return 0; } } WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); ReleaseMutex ) { /* while(index++<=100) cout<<"thread1 is running"<<endl; return 0; while(true) { WaitForSingleObject sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex);//好像是可以自动释放的 } */ WaitForSingleObject ) { /* while(index++<=100) cout<<"thread2 is running"<<endl; return 0; while(true) { WaitForSingleObject cout<<"thread2 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } */ WaitForSingleObject
std; HANDLE evRead, evFinish; DWORD WINAPI ReadThread(PVOID pParam) { // 当等待仍在挂起状态的时候,句柄被关闭 WaitForSingleObject 0, ReadThread, NULL, 0, NULL); Sleep(1000); CreateThread(NULL, 0, WriteThread, NULL, 0, NULL); WaitForSingleObject PVOID pParam) { HANDLE *phMutex = (HANDLE*)pParam; for (int i = 1; i <= 1000000; i++) { WaitForSingleObject (hTH1, INFINITE); WaitForSingleObject(hTH2, INFINITE); WaitForSingleObject(hTH3, INFINITE); WaitForSingleObject (hTH4, INFINITE); WaitForSingleObject(hTH5, INFINITE); WaitForSingleObject(hTH6, INFINITE); WaitForSingleObject
lock函数和tryLock函数都是用于锁定对象,但他们之间有一定的区别: lock函数是阻塞的,因为它调用WaitForSingleObject函数时传递的第二个参数是INFINITE,表示无限等待下去 因为它调用WaitForSingleObject函数时传递的第二个参数是0,表示不等待,立即返回。 调用lock或者tryLock后,都需要调用unlock来解锁。 status_t Mutex::lock() { DWORD dwWaitResult; dwWaitResult = WaitForSingleObject((HANDLE unlocking mutex\n"); } status_t Mutex::tryLock() { DWORD dwWaitResult; dwWaitResult = WaitForSingleObject 0 : -1; } WaitForSingleObject函数的用法如下: DWORD WaitForSingleObject ( HANDLE hObject, //指明一个内核对象的句柄
Sleep(2000); return 0; } HANDLE g_event = nullptr; DWORD WINAPI Thread2(PVOID param) { WaitForSingleObject SetEvent(g_event); return 0; } HANDLE g_timer = nullptr; DWORD WINAPI Thread3(PVOID param) { WaitForSingleObject HANDLE hthread = CreateThread(nullptr, 0, Thread, nullptr, 0, nullptr); //等待线程被触发 DWORD dres = WaitForSingleObject nullptr, FALSE); HANDLE hthread3 = CreateThread(nullptr, 0, Thread3, nullptr, 0, nullptr); WaitForSingleObject //ReleaseSemaphore //互斥量 //CreateMutex //OpenMutex //WaitForSingleObject //
nullptr, 0, nullptr); HANDLE hthread2 = CreateThread(nullptr, 0, Thread2, nullptr, 0, nullptr); WaitForSingleObject (hthread1, INFINITE); WaitForSingleObject(hthread2, INFINITE); CloseHandle(hthread1); hthread1 nullptr, 0, nullptr); HANDLE hthread4 = CreateThread(nullptr, 0, Thread4, nullptr, 0, nullptr); WaitForSingleObject (hthread3, INFINITE); WaitForSingleObject(hthread4, INFINITE); CloseHandle(hthread3); hthread3 (hthread5, INFINITE); WaitForSingleObject(hthread6, INFINITE); CloseHandle(hthread5); hthread5
申请与释放 WaitForSingleObject(hMutex, DWORD dwTimeOut); /* do the task; */ ReleaseMutex (hMutex); 例如,可设超时为100毫秒,如下所示: if (WAIT_TIMEOUT == WaitForSingleObject(hrecvEven, 100) FALSE, NULL); // 实始化信号量,初始状态为非信号通知 SetEvent(hEvent ); //信号通知 ThreadA { WaitForSingleObject /* do the task; */ SetEvent(hEvnet); } ThreadB { WaitForSingleObject 成功后,在A执行ResetEvent之前,B可能抢占了CPU并执行了WaitForSingleObject,从而B也有权利执行ResetEvent,这样A、B都有权执行,这种情况下,等于有两个人都可以控制
当使用WaitForSingleObject或者WaitForMultipleObjects函数等待事件对象时,会阻塞线程直到事件状态被置位。 (hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); // non-signaled 如果不更改,对象继续停留在signaled 可以通过ReleaseSemaphore函数将该信号量对象的计数加1,通过WaitForSingleObject或者WaitForMultipleObjects函数等待信号量对象的计数变成正数以后再将其减 执行WaitForSingleObject(semTwo, INFINITE);会让线程函数进入类似挂起的状态,当接到ReleaseSemaphore(semOne, 1, NULL);才会恢复执行。 可以通过WaitForSingleObject或者WaitForMultipleObjects函数等待互斥体对象,以确保只有一个线程能够访问共享资源,其他线程需要等待该线程释放互斥体对象后才能继续访问。
当使用WaitForSingleObject或者WaitForMultipleObjects函数等待事件对象时,会阻塞线程直到事件状态被置位。 可以通过ReleaseSemaphore函数将该信号量对象的计数加1,通过WaitForSingleObject或者WaitForMultipleObjects函数等待信号量对象的计数变成正数以后再将其减 执行WaitForSingleObject(semTwo, INFINITE);会让线程函数进入类似挂起的状态,当接到ReleaseSemaphore(semOne, 1, NULL);才会恢复执行。 (hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); CloseHandle(semOne); CloseHandle 可以通过WaitForSingleObject或者WaitForMultipleObjects函数等待互斥体对象,以确保只有一个线程能够访问共享资源,其他线程需要等待该线程释放互斥体对象后才能继续访问。
WaitForSingleObject 等待指定对象处于信号状态或超时间隔结束。 begin\n"); wr = WaitForSingleObject(hThread, INFINITE); /*if ((wr = WaitForSingleObject(hThread, INFINITE 请求互斥对象所有权:调用函数WaitForSingleObject函数。线程必须主动请求共享对象的所有权才能获得所有权。 释放指定互斥对象的所有权:调用ReleaseMutex函数。 请求事件对象 线程通过调用WaitForSingleObject函数请求事件对象。 WaitForSingleObject(hEvent, INFINITE); for (i = 0; str[i] !