win用事件实现多线程
时间: 2023-07-12 17:29:30 浏览: 75
在Windows操作系统中,可以使用事件(Event)来实现多线程同步和通信。下面是一个简单的示例:
```c++
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hEvent;
HANDLE hThread1;
HANDLE hThread2;
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hEvent, INFINITE); // 等待事件
// 执行线程1的任务
cout << "Thread 1 is running" << endl;
SetEvent(hEvent); // 触发事件,通知线程2可以执行任务
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hEvent, INFINITE); // 等待事件
// 执行线程2的任务
cout << "Thread 2 is running" << endl;
SetEvent(hEvent); // 触发事件,通知线程1可以执行任务
}
return 0;
}
int main()
{
hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); // 创建事件对象,初始状态为触发状态
hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); // 创建线程1
hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); // 创建线程2
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
return 0;
}
```
在上面的示例中,我们使用CreateEvent函数创建了一个事件对象,并将它的初始状态设置为触发状态。然后,我们创建了两个线程hThread1和hThread2,并分别执行ThreadProc1和ThreadProc2函数。在这两个函数中,我们使用WaitForSingleObject函数等待事件对象的触发,并在触发后执行相应的任务。在任务执行完毕后,我们调用SetEvent函数触发事件对象,通知另一个线程可以开始执行任务。
需要注意的是,WaitForSingleObject函数和SetEvent函数在执行时可能会阻塞线程,因此需要小心使用,避免出现死锁等问题。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)