在C++中,wait()
函數通常與條件變量一起使用,用于讓當前線程等待某個條件成立。wait()
函數本身不能直接自定義,但你可以通過條件變量來實現自定義的等待邏輯。
以下是一個簡單的示例,展示了如何使用條件變量和wait()
函數實現自定義等待邏輯:
#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) { // 如果 ready 為 false, 則等待
cv.wait(lck); // 當前線程被阻塞,直到 condition 變量變為 true
}
std::cout << "thread " << id << '\n';
}
void go() {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lck(mtx);
ready = true; // 修改共享數據
cv.notify_all(); // 喚醒所有等待的線程
}
int main() {
std::thread threads[10];
// spawn 10 threads:
for (int i = 0; i < 10; ++i)
threads[i] = std::thread(print_id, i);
std::cout << "10 threads ready to race...\n";
go(); // go!
for (auto &th : threads) th.join();
return 0;
}
在這個示例中,我們創建了一個名為ready
的共享變量,用于表示條件是否滿足。我們還創建了一個條件變量cv
和一個互斥鎖mtx
。print_id
函數中的線程會等待ready
變量變為true
,然后繼續執行。go
函數中的線程會將ready
變量設置為true
,并通過cv.notify_all()
喚醒所有等待的線程。
這個示例展示了如何使用條件變量和wait()
函數實現自定義等待邏輯。你可以根據自己的需求修改這個示例,以實現更復雜的同步和通信場景。