WaitForSingleObject函数的用途和示例代码
WaitForSingleObject函数的用途
WaitForSingleObject函数是Windows操作系统提供的函数之一,用于控制线程或进程的同步和互斥。它的主要作用是阻塞当前线程,直到指定的对象状态发生变化。
该函数可以等待多种类型的对象,包括线程、进程、互斥量、计数器、信号量、事件以及文件句柄等。通过调用WaitForSingleObject函数,可以使当前线程暂停执行,直到所等待的对象变为有信号状态。
示例代码
下面是一个使用WaitForSingleObject函数的示例代码:
#include
#include
DWORD WINAPI MyThread(LPVOID lpParam) {
HANDLE hEvent = (HANDLE)lpParam;
printf("Thread is waiting for event...\n");
DWORD dwWaitResult = WaitForSingleObject(hEvent, INFINITE);
if (dwWaitResult == WAIT_OBJECT_0) {
printf("Event signaled, thread resumes execution.\n");
}
return 0;
}
int main() {
HANDLE hThread;
HANDLE hEvent;
// 创建事件
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent == NULL) {
fprintf(stderr, "Error creating event (%d)\n", GetLastError());
return 1;
}
// 创建线程
hThread = CreateThread(NULL, 0, MyThread, hEvent, 0, NULL);
if (hThread == NULL) {
fprintf(stderr, "Error creating thread (%d)\n", GetLastError());
return 1;
}
// 主线程等待一段时间后,设置事件为有信号状态
Sleep(2000);
if (!SetEvent(hEvent)) {
fprintf(stderr, "Error setting event (%d)\n", GetLastError());
return 1;
}
// 等待线程结束
WaitForSingleObject(hThread, INFINITE);
// 关闭句柄
CloseHandle(hEvent);
CloseHandle(hThread);
return 0;
}
以上示例代码演示了如何使用WaitForSingleObject函数等待一个事件对象。在示例代码中,主线程创建一个事件对象,然后创建一个新的线程并传递该事件对象作为参数。
在新线程中,调用WaitForSingleObject函数等待事件对象的信号,如果等待成功(返回值为WAIT_OBJECT_0),则打印出"Event signaled, thread resumes execution.",表示事件已经发生,并且新线程可以继续执行。
主线程在延迟一段时间后,通过调用SetEvent函数将事件对象设为有信号状态,这样就触发了新线程的等待条件,解除了其阻塞状态,使其可以继续执行。
最后,主线程通过调用WaitForSingleObject函数等待新线程结束,确保所有线程都执行完毕后,关闭句柄并退出程序。
总结
WaitForSingleObject函数是一个非常有用的函数,可以实现线程或进程间的同步和互斥。通过等待指定对象的信号,可以控制线程的执行顺序,确保多个线程之间的正确协作。以上示例代码演示了如何使用WaitForSingleObject函数等待事件对象的信号,但它还可以用于其他类型的对象,具体使用方式需要根据具体需求来确定。
上一篇