test_condition.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 191 行

CPP
191
字号
// Copyright (C) 2001-2003// William E. Kempf// Copyright (C) 2007 Anthony Williams////  Distributed under the Boost Software License, Version 1.0. (See accompanying //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#include <boost/thread/detail/config.hpp>#include <boost/thread/condition.hpp>#include <boost/thread/thread.hpp>#include <boost/thread/xtime.hpp>#include <boost/test/unit_test.hpp>#include <libs/thread/test/util.inl>struct condition_test_data{    condition_test_data() : notified(0), awoken(0) { }    boost::mutex mutex;    boost::condition_variable condition;    int notified;    int awoken;};void condition_test_thread(condition_test_data* data){    boost::mutex::scoped_lock lock(data->mutex);    BOOST_CHECK(lock ? true : false);    while (!(data->notified > 0))        data->condition.wait(lock);    BOOST_CHECK(lock ? true : false);    data->awoken++;}struct cond_predicate{    cond_predicate(int& var, int val) : _var(var), _val(val) { }    bool operator()() { return _var == _val; }    int& _var;    int _val;private:    void operator=(cond_predicate&);    };void condition_test_waits(condition_test_data* data){    boost::mutex::scoped_lock lock(data->mutex);    BOOST_CHECK(lock ? true : false);    // Test wait.    while (data->notified != 1)        data->condition.wait(lock);    BOOST_CHECK(lock ? true : false);    BOOST_CHECK_EQUAL(data->notified, 1);    data->awoken++;    data->condition.notify_one();    // Test predicate wait.    data->condition.wait(lock, cond_predicate(data->notified, 2));    BOOST_CHECK(lock ? true : false);    BOOST_CHECK_EQUAL(data->notified, 2);    data->awoken++;    data->condition.notify_one();    // Test timed_wait.    boost::xtime xt = delay(10);    while (data->notified != 3)        data->condition.timed_wait(lock, xt);    BOOST_CHECK(lock ? true : false);    BOOST_CHECK_EQUAL(data->notified, 3);    data->awoken++;    data->condition.notify_one();    // Test predicate timed_wait.    xt = delay(10);    cond_predicate pred(data->notified, 4);    BOOST_CHECK(data->condition.timed_wait(lock, xt, pred));    BOOST_CHECK(lock ? true : false);    BOOST_CHECK(pred());    BOOST_CHECK_EQUAL(data->notified, 4);    data->awoken++;    data->condition.notify_one();    // Test predicate timed_wait with relative timeout    cond_predicate pred_rel(data->notified, 5);    BOOST_CHECK(data->condition.timed_wait(lock, boost::posix_time::seconds(10), pred_rel));    BOOST_CHECK(lock ? true : false);    BOOST_CHECK(pred_rel());    BOOST_CHECK_EQUAL(data->notified, 5);    data->awoken++;    data->condition.notify_one();}void do_test_condition_waits(){    condition_test_data data;    boost::thread thread(bind(&condition_test_waits, &data));    {        boost::mutex::scoped_lock lock(data.mutex);        BOOST_CHECK(lock ? true : false);        boost::thread::sleep(delay(1));        data.notified++;        data.condition.notify_one();        while (data.awoken != 1)            data.condition.wait(lock);        BOOST_CHECK(lock ? true : false);        BOOST_CHECK_EQUAL(data.awoken, 1);        boost::thread::sleep(delay(1));        data.notified++;        data.condition.notify_one();        while (data.awoken != 2)            data.condition.wait(lock);        BOOST_CHECK(lock ? true : false);        BOOST_CHECK_EQUAL(data.awoken, 2);        boost::thread::sleep(delay(1));        data.notified++;        data.condition.notify_one();        while (data.awoken != 3)            data.condition.wait(lock);        BOOST_CHECK(lock ? true : false);        BOOST_CHECK_EQUAL(data.awoken, 3);        boost::thread::sleep(delay(1));        data.notified++;        data.condition.notify_one();        while (data.awoken != 4)            data.condition.wait(lock);        BOOST_CHECK(lock ? true : false);        BOOST_CHECK_EQUAL(data.awoken, 4);        boost::thread::sleep(delay(1));        data.notified++;        data.condition.notify_one();        while (data.awoken != 5)            data.condition.wait(lock);        BOOST_CHECK(lock ? true : false);        BOOST_CHECK_EQUAL(data.awoken, 5);    }    thread.join();    BOOST_CHECK_EQUAL(data.awoken, 5);}void test_condition_waits(){    // We should have already tested notify_one here, so    // a timed test with the default execution_monitor::use_condition    // should be OK, and gives the fastest performance    timed_test(&do_test_condition_waits, 12);}void do_test_condition_wait_is_a_interruption_point(){    condition_test_data data;    boost::thread thread(bind(&condition_test_thread, &data));    thread.interrupt();    thread.join();    BOOST_CHECK_EQUAL(data.awoken,0);}void test_condition_wait_is_a_interruption_point(){    timed_test(&do_test_condition_wait_is_a_interruption_point, 1);}boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[]){    boost::unit_test_framework::test_suite* test =        BOOST_TEST_SUITE("Boost.Threads: condition test suite");    test->add(BOOST_TEST_CASE(&test_condition_waits));    test->add(BOOST_TEST_CASE(&test_condition_wait_is_a_interruption_point));    return test;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?