/* TAGS: big */ /* VERIFY_OPTS: -o nofail:malloc */ /* CC_OPTS: -Dgmtime_r=gmtime -Dlocaltime_r=localtime -DBOOST_HAS_PTHREADS -DBOOST_THREAD_POSIX -DPOSIX_THREADS -D__linux -D_SC_PAGESIZE -I $BOOST/libs/thread/include/ -I test/termination -I $BOOST/libs/config/include/ -I $BOOST/libs/throw_exception/include -I $BOOST/libs/assert/include/ -I $BOOST/libs/core/include/ -I $BOOST/libs/system/include/ -I $BOOST/libs/type_traits/include/ -I $BOOST/libs/static_assert/include/ -I $BOOST/libs/move/include/ -I $BOOST/libs/date_time/include/ -I $BOOST/libs/smart_ptr/include/ -I $BOOST/libs/predef/include -I $BOOST/libs/utility/include/ -I $BOOST/libs/mpl/include/ -I$BOOST/libs/preprocessor/include/ -I $BOOST/libs/numeric/conversion/include/ -I $BOOST/libs/chrono/include/ -I $BOOST/libs/ratio/include/ -I $BOOST/libs/integer/include/ -I $BOOST/libs/bind/include/ -I $BOOST/libs/io/include/ -I $BOOST/libs/container_hash/include/ -I $BOOST/libs/detail/include/ -I $BOOST/libs/atomic/include/ -I $BOOST/libs/tuple/include/ -I $BOOST/libs/exception/include/ -I $BOOST/libs/iterator/include/ -I $BOOST/libs/optional/include/ -I $BOOST/libs/function/include/ -I $BOOST/libs/type_index/include/ -I $BOOST/libs/algorithm/include -I $BOOST/libs/range/include -I $BOOST/libs/concept_check/include/ -I $BOOST/libs/lexical_cast/include/ -I $BOOST/libs/array/include/ -I $BOOST/libs/container/include/ -I $BOOST/libs/math/include */ /* EXTRA_SRCS: $BOOST/libs/thread/src/pthread/thread.cpp $BOOST/libs/thread/src/pthread/once_atomic.cpp */ #include #include #include #include #include #include // V: 1@safety // V: 2@safety CC_OPT: -DNTHR=2 // V: 1@local V_OPT: --nontermination local // V: 2@local V_OPT: --nontermination local CC_OPT: -DNTHR=2 // V: 1@global V_OPT: --nontermination global // V: 2@global V_OPT: --nontermination global CC_OPT: -DNTHR=2 #ifdef NTHR constexpr int nthr = NTHR; #else constexpr int nthr = 1; #endif int main() { boost::synchronized_value< std::string > sv1, sv2; auto worker = [&]( int v ) { return [&, v] { sv1->push_back( 'a' + v ); }; }; std::vector< std::thread > thrs; thrs.reserve( nthr ); for ( int i = 0; i < nthr; ++i ) thrs.emplace_back( worker( i ) ); { auto [ a, b ] = synchronize( sv1, sv2 ); a->swap( *b ); } for ( auto &t : thrs ) t.join(); std::string u1 = *sv1, u2 = *sv2; __dios_trace_f( "size1 = %d, value1 = %s; size2 = %d, value2 = %d", int( u1.size() ), u1.c_str(), int( u2.size() ), u2.c_str() ); assert( u1.size() + u2.size() == nthr ); std::array< int, nthr > cnt{}; for ( auto &vs : { u1, u2 } ) for ( auto v : vs ) cnt[ v - 'a' ]++; for ( auto v : cnt ) assert( v == 1 ); }