CreateThread与主线程同步
时间: 2023-08-16 20:08:40 浏览: 125
在 Windows 程序中,可以使用 `CreateThread` 函数来创建一个新线程。如果需要让新线程与主线程同步,可以使用 Windows API 提供的同步机制,例如事件对象、互斥量、临界区等。
以下是一个示例代码,演示如何使用事件对象来实现主线程等待新线程执行完毕:
```c++
#include <iostream>
#include <Windows.h>
DWORD WINAPI thread_func(LPVOID lpParam) {
std::cout << "Thread started" << std::endl;
// 线程执行的代码
std::cout << "Thread ended" << std::endl;
SetEvent((HANDLE)lpParam); // 通知主线程
return 0;
}
int main() {
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // 创建事件对象
if (hEvent == NULL) {
std::cerr << "Failed to create event object" << std::endl;
return 1;
}
HANDLE hThread = CreateThread(NULL, 0, thread_func, hEvent, 0, NULL); // 创建线程
if (hThread == NULL) {
std::cerr << "Failed to create thread" << std::endl;
CloseHandle(hEvent);
return 1;
}
WaitForSingleObject(hEvent, INFINITE); // 等待事件
std::cout << "Main thread ended" << std::endl;
CloseHandle(hThread);
CloseHandle(hEvent);
return 0;
}
```
在这个示例中,我们创建了一个事件对象 `hEvent`,并将它作为参数传递给新线程的 `thread_func()` 函数。在新线程执行完毕后,调用 `SetEvent()` 函数通知主线程。主线程在调用 `WaitForSingleObject()` 函数等待事件对象,直到新线程执行完毕并通知主线程。最后,主线程结束并释放资源。
需要注意的是,在使用事件对象等同步机制时,需要合理设置对象的初始状态和使用方式,否则可能会导致线程死锁或其他问题。
阅读全文