SetEvent
是 Windows API 中的一個函數,用于設置一個事件對象的狀態為已觸發
下面是一個使用 C++ 和 SetEvent
函數實現復雜線程控制的示例:
#include<iostream>
#include<vector>
#include<thread>
#include <mutex>
#include<condition_variable>
#include<windows.h>
// 定義一個全局事件對象
HANDLE g_event = CreateEvent(NULL, FALSE, FALSE, NULL);
void worker_thread(int thread_id) {
std::cout << "Thread "<< thread_id << " is waiting for event..."<< std::endl;
// 等待事件被觸發
WaitForSingleObject(g_event, INFINITE);
std::cout << "Thread "<< thread_id << " received the event!"<< std::endl;
}
int main() {
const int num_threads = 5;
std::vector<std::thread> threads;
// 創建多個工作線程
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back(worker_thread, i);
}
// 讓主線程休眠一段時間,以便其他線程有足夠的時間進入等待狀態
Sleep(2000);
std::cout << "Main thread is setting the event..."<< std::endl;
// 設置事件對象的狀態為已觸發
SetEvent(g_event);
// 等待所有工作線程完成
for (auto& t : threads) {
t.join();
}
CloseHandle(g_event);
return 0;
}
在這個示例中,我們創建了一個全局事件對象 g_event
。然后,我們創建了多個工作線程,每個線程都會調用 worker_thread
函數。在 worker_thread
函數中,線程會調用 WaitForSingleObject
函數等待事件被觸發。當主線程調用 SetEvent
函數設置事件對象的狀態為已觸發時,所有等待該事件的線程將被喚醒并繼續執行。
請注意,這個示例僅適用于 Windows 平臺。如果你需要在其他平臺上實現類似的功能,可以考慮使用 C++11 標準庫中的 std::condition_variable
類。