bug_000008.cpp

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

CPP
116
字号
/*=============================================================================    Copyright (c) 2003 Martin Wille    http://spirit.sourceforge.net/    Use, modification and distribution is subject to 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)=============================================================================*/  // see http://article.gmane.org/gmane.comp.parsers.spirit.general/4575  // or https://sf.net/mailarchive/forum.php?thread_id=2692308&forum_id=1595  // for a description of the bug being tested for by this program  //  // the problem should be solved with version 1.3 of phoenix/closures.hpp>#if defined(BOOST_SPIRIT_DEBUG) && defined(__GNUC__) && defined(__WIN32__)// It seems that MinGW has some problems with threads and iostream ?// This code crashes MinGW when BOOST_SPIRIT_DEBUG is defined. The reason// is beyond me. Disable BOOST_SPIRIT_DEBUG for now.#undef BOOST_SPIRIT_DEBUG#endif#include <iostream>#include <boost/config.hpp>#include <boost/detail/lightweight_test.hpp>#if defined(DONT_HAVE_BOOST) || !defined(BOOST_HAS_THREADS) || defined(BOOST_DISABLE_THREADS)// we end here if we can't do multithreadingstatic void skipped(){    std::cout << "skipped\n";}intmain(){    skipped();    return boost::report_errors();}#else// the real MT stuff#undef BOOST_SPIRIT_THREADSAFE#define BOOST_SPIRIT_THREADSAFE#undef PHOENIX_THREADSAFE#define PHOENIX_THREADSAFE#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_closure.hpp>#include <boost/thread.hpp>static const int number_of_calls_to_parse_per_thread=20000;struct test_closure    : BOOST_SPIRIT_CLASSIC_NS::closure<test_closure, char const*>{    member1 b;};struct test_grammar    : BOOST_SPIRIT_CLASSIC_NS::grammar<test_grammar, test_closure::context_t>{    test_grammar() {}    template <typename ScannerT>    struct definition    {        definition(test_grammar const &self)        {            using namespace phoenix;            rule = BOOST_SPIRIT_CLASSIC_NS::epsilon_p[self.b = arg1];        }        BOOST_SPIRIT_CLASSIC_NS::rule<ScannerT> const &start() const { return rule; }        BOOST_SPIRIT_CLASSIC_NS::rule<ScannerT> rule;    };};test_grammar const g;voidin_thread(void){    char const text[]="foo";    for(int i=0; i<number_of_calls_to_parse_per_thread; ++i)    {        BOOST_SPIRIT_CLASSIC_NS::parse(&text[0], text+sizeof(text), g);    }}voidbug_000008(){    boost::thread t1(in_thread);    boost::thread t2(in_thread);    boost::thread t3(in_thread);    boost::thread t4(in_thread);    t1.join();    t2.join();    t3.join();    t4.join();}intmain(){    bug_000008();    return boost::report_errors();}#endif

⌨️ 快捷键说明

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