test_thread_launching.cpp

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

CPP
227
字号
// Copyright (C) 2007-8 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/thread.hpp>#include <boost/test/unit_test.hpp>#include <boost/ref.hpp>#include <boost/utility.hpp>#include <string>#include <vector>bool normal_function_called=false;void normal_function(){    normal_function_called=true;}void test_thread_function_no_arguments(){    boost::thread function(normal_function);    function.join();    BOOST_CHECK(normal_function_called);}int nfoa_res=0;void normal_function_one_arg(int i){    nfoa_res=i;}void test_thread_function_one_argument(){    boost::thread function(normal_function_one_arg,42);    function.join();    BOOST_CHECK_EQUAL(42,nfoa_res);}struct callable_no_args{    static bool called;        void operator()() const    {        called=true;    }};bool callable_no_args::called=false;void test_thread_callable_object_no_arguments(){    callable_no_args func;    boost::thread callable(func);    callable.join();    BOOST_CHECK(callable_no_args::called);}struct callable_noncopyable_no_args:    boost::noncopyable{    static bool called;        void operator()() const    {        called=true;    }};bool callable_noncopyable_no_args::called=false;void test_thread_callable_object_ref_no_arguments(){    callable_noncopyable_no_args func;        boost::thread callable(boost::ref(func));    callable.join();    BOOST_CHECK(callable_noncopyable_no_args::called);}struct callable_one_arg{    static bool called;    static int called_arg;        void operator()(int arg) const    {        called=true;        called_arg=arg;    }};bool callable_one_arg::called=false;int callable_one_arg::called_arg=0;void test_thread_callable_object_one_argument(){    callable_one_arg func;    boost::thread callable(func,42);    callable.join();    BOOST_CHECK(callable_one_arg::called);    BOOST_CHECK_EQUAL(callable_one_arg::called_arg,42);}struct callable_multiple_arg{    static bool called_two;    static int called_two_arg1;    static double called_two_arg2;    static bool called_three;    static std::string called_three_arg1;    static std::vector<int> called_three_arg2;    static int called_three_arg3;        void operator()(int arg1,double arg2) const    {        called_two=true;        called_two_arg1=arg1;        called_two_arg2=arg2;    }    void operator()(std::string const& arg1,std::vector<int> const& arg2,int arg3) const    {        called_three=true;        called_three_arg1=arg1;        called_three_arg2=arg2;        called_three_arg3=arg3;    }};bool callable_multiple_arg::called_two=false;bool callable_multiple_arg::called_three=false;int callable_multiple_arg::called_two_arg1;double callable_multiple_arg::called_two_arg2;std::string callable_multiple_arg::called_three_arg1;std::vector<int> callable_multiple_arg::called_three_arg2;int callable_multiple_arg::called_three_arg3;void test_thread_callable_object_multiple_arguments(){    std::vector<int> x;    for(unsigned i=0;i<7;++i)    {        x.push_back(i*i);    }    callable_multiple_arg func;        boost::thread callable3(func,"hello",x,1.2);    callable3.join();    BOOST_CHECK(callable_multiple_arg::called_three);    BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg1,"hello");    BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg2.size(),x.size());    for(unsigned j=0;j<x.size();++j)    {        BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg2.at(j),x[j]);    }        BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg3,1);    double const dbl=1.234;        boost::thread callable2(func,19,dbl);    callable2.join();    BOOST_CHECK(callable_multiple_arg::called_two);    BOOST_CHECK_EQUAL(callable_multiple_arg::called_two_arg1,19);    BOOST_CHECK_EQUAL(callable_multiple_arg::called_two_arg2,dbl);}struct X{    bool function_called;    int arg_value;    X():        function_called(false),        arg_value(0)    {}        void f0()    {        function_called=true;    }    void f1(int i)    {        arg_value=i;    }};void test_thread_member_function_no_arguments(){    X x;        boost::thread function(&X::f0,&x);    function.join();    BOOST_CHECK(x.function_called);}void test_thread_member_function_one_argument(){    X x;    boost::thread function(&X::f1,&x,42);    function.join();    BOOST_CHECK_EQUAL(42,x.arg_value);}boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[]){    boost::unit_test_framework::test_suite* test =        BOOST_TEST_SUITE("Boost.Threads: thread launching test suite");    test->add(BOOST_TEST_CASE(test_thread_function_no_arguments));    test->add(BOOST_TEST_CASE(test_thread_function_one_argument));    test->add(BOOST_TEST_CASE(test_thread_callable_object_no_arguments));    test->add(BOOST_TEST_CASE(test_thread_callable_object_ref_no_arguments));    test->add(BOOST_TEST_CASE(test_thread_callable_object_one_argument));    test->add(BOOST_TEST_CASE(test_thread_callable_object_multiple_arguments));    test->add(BOOST_TEST_CASE(test_thread_member_function_no_arguments));    test->add(BOOST_TEST_CASE(test_thread_member_function_one_argument));    return test;}

⌨️ 快捷键说明

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