1. 程式人生 > >[c++11]條件變數測試

[c++11]條件變數測試

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
#include <chrono>

std::mutex global_mutex;
std::condition_variable global_cv;
bool is_avaliable = false;

void cv_thread()
{
    int cnt = 0;
    std::unique_lock<std::mutex> lock(global_mutex);
    std::cout << "cv_thread, before loop, is locked = " << lock.owns_lock() << std::endl;
    while (is_avaliable == false)
    {
        global_cv.wait(lock);
        std::cout << "cv_thread, in loop, is locked = " << lock.owns_lock();
        std::cout << " cnt = " << cnt << std::endl;
        ++cnt;
        if (cnt == 10)
        {
            break;
        }
    }
}

void cv_nodify()
{
    std::unique_lock<std::mutex> lock(global_mutex);
    global_cv.notify_all();
}

int main()
{
    std::thread cv_work(cv_thread);
    for (int i = 0; i < 10; ++i)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "send notify : " << i << std::endl;
        cv_nodify();
    }
    cv_work.join();
    return 0;
}

輸出:

cv_thread, before loop, is locked = 1 send notify : 0 cv_thread, in loop, is locked = 1 cnt = 0 send notify : 1 cv_thread, in loop, is locked = 1 cnt = 1 send notify : 2 cv_thread, in loop, is locked = 1 cnt = 2 send notify : 3 cv_thread, in loop, is locked = 1 cnt = 3 send notify : 4 cv_thread, in loop, is locked = 1 cnt = 4 send notify : 5 cv_thread, in loop, is locked = 1 cnt = 5 send notify : 6 cv_thread, in loop, is locked = 1 cnt = 6 send notify : 7 cv_thread, in loop, is locked = 1 cnt = 7 send notify : 8 cv_thread, in loop, is locked = 1 cnt = 8 send notify : 9 cv_thread, in loop, is locked = 1 cnt = 9