如何测试NotifyAll方法的正确性

   2024-09-30 7590
核心提示:要测试NotifyAll方法的正确性,您需要创建一个多线程环境,使用锁(例如互斥锁)和条件变量来控制线程之间的同步。以下是一个使

要测试NotifyAll方法的正确性,您需要创建一个多线程环境,使用锁(例如互斥锁)和条件变量来控制线程之间的同步。以下是一个使用C++11的示例,展示了如何测试NotifyAll方法:

#include<iostream>#include<thread>#include <mutex>#include<condition_variable>#include<vector>std::mutex mtx;std::condition_variable cv;int shared_value = 0;void worker(int id) {    std::unique_lock<std::mutex> lock(mtx);    std::cout << "Thread " << id << " is waiting."<< std::endl;    cv.wait(lock, [] { return shared_value == 1; });    std::cout << "Thread " << id << " is notified."<< std::endl;}int main() {    std::vector<std::thread> threads;    // 创建5个工作线程    for (int i = 0; i < 5; ++i) {        threads.emplace_back(worker, i);    }    // 等待所有线程进入等待状态    std::this_thread::sleep_for(std::chrono::seconds(1));    // 修改共享值并通知所有线程    {        std::unique_lock<std::mutex> lock(mtx);        shared_value = 1;    }    cv.notify_all();    // 等待所有线程完成    for (auto& t : threads) {        t.join();    }    return 0;}

在这个示例中,我们创建了5个工作线程,每个线程都在等待共享值shared_value变为1。主线程在修改共享值后调用cv.notify_all(),这将唤醒所有等待的线程。

运行此代码将输出类似于以下内容:

Thread 0 is waiting.Thread 1 is waiting.Thread 2 is waiting.Thread 3 is waiting.Thread 4 is waiting.Thread 0 is notified.Thread 1 is notified.Thread 2 is notified.Thread 3 is notified.Thread 4 is notified.

请注意,线程的唤醒顺序可能会有所不同,因为操作系统可能会以不同的方式调度线程。但是,所有线程最终都应该被唤醒并打印“notified”消息。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号