在C++中,notify
通常與事件驅動編程和多線程編程相關。事件驅動編程是一種編程范式,其中程序的執行流程由外部事件(如用戶輸入、網絡消息等)來控制。在這種范式中,程序會等待并響應這些事件,而不是按照預定的順序執行。
notify
函數通常與條件變量(condition variable)或者其他同步原語(如互斥鎖、信號量等)一起使用,以實現線程間的通信和同步。當一個線程需要通知另一個線程發生了某個事件時,它可以調用notify
函數。被通知的線程可以使用wait
函數等待事件的發生。
下面是一個簡單的C++示例,展示了如何使用std::condition_variable
和notify
實現事件驅動編程:
#include<iostream>
#include<thread>
#include <mutex>
#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) { // 如果事件尚未發生,則等待
cv.wait(lck); // 當前線程被阻塞,等待條件變量被通知
}
std::cout << "thread " << id << '\n';
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true; // 設置事件為已發生
cv.notify_all(); // 通知所有等待的線程
}
int main() {
std::thread threads[10];
for (int i = 0; i < 10; ++i) {
threads[i] = std::thread(print_id, i);
}
std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待1秒
go(); // 設置事件為已發生,并通知所有等待的線程
for (auto &th : threads) {
th.join();
}
return 0;
}
在這個示例中,我們創建了10個線程,每個線程都在等待一個事件(ready
變量變為true
)。主線程在1秒后設置事件為已發生,并調用notify_all
函數通知所有等待的線程。這樣,所有線程都會收到通知,并繼續執行。