diff --git a/test/Jamfile b/test/Jamfile index 4daede5..1dde2c0 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -381,3 +381,19 @@ run ip_hash_test2.cpp ; run sp_hash_test4.cpp ; run lsp_hash_test.cpp ; run lsp_hash_test2.cpp ; + +run atomic_count_mt_test.cpp + : : : multi ; + +run spinlock_mt_test.cpp + : : : multi ; + +run spinlock_pool_mt_test.cpp + : : : multi ; + +run shared_ptr_mt_test.cpp + : : : multi ; + +run weak_ptr_mt_test.cpp + : : : multi ; + diff --git a/test/atomic_count_mt_test.cpp b/test/atomic_count_mt_test.cpp new file mode 100644 index 0000000..6318e29 --- /dev/null +++ b/test/atomic_count_mt_test.cpp @@ -0,0 +1,40 @@ +// Copyright 2018, 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +static boost::detail::atomic_count count( 0 ); + +void f( int n ) +{ + for( int i = 0; i < n; ++i ) + { + ++count; + } +} + +int main() +{ + int const N = 100000; // iterations + int const M = 8; // threads + + boost::detail::lw_thread_t th[ M ] = {}; + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + BOOST_TEST_EQ( count, N * M ); + + return boost::report_errors(); +} diff --git a/test/shared_ptr_mt_test.cpp b/test/shared_ptr_mt_test.cpp new file mode 100644 index 0000000..8b2f433 --- /dev/null +++ b/test/shared_ptr_mt_test.cpp @@ -0,0 +1,46 @@ +// Copyright 2018, 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include +#include + +static boost::shared_ptr sp( new int ); + +void f( int n ) +{ + for( int i = 0; i < n; ++i ) + { + boost::shared_ptr p1( sp ); + boost::weak_ptr p2( p1 ); + } +} + +int main() +{ + int const N = 100000; // iterations + int const M = 8; // threads + + boost::detail::lw_thread_t th[ M ] = {}; + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + BOOST_TEST_EQ( sp.use_count(), 1 ); + + sp.reset(); + + BOOST_TEST_EQ( sp.use_count(), 0 ); + + return boost::report_errors(); +} diff --git a/test/spinlock_mt_test.cpp b/test/spinlock_mt_test.cpp new file mode 100644 index 0000000..ac667aa --- /dev/null +++ b/test/spinlock_mt_test.cpp @@ -0,0 +1,42 @@ +// Copyright 2018, 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +static int count = 0; +static boost::detail::spinlock sp = BOOST_DETAIL_SPINLOCK_INIT; + +void f( int n ) +{ + for( int i = 0; i < n; ++i ) + { + boost::detail::spinlock::scoped_lock lock( sp ); + ++count; + } +} + +int main() +{ + int const N = 100000; // iterations + int const M = 8; // threads + + boost::detail::lw_thread_t th[ M ] = {}; + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + BOOST_TEST_EQ( count, N * M ); + + return boost::report_errors(); +} diff --git a/test/spinlock_pool_mt_test.cpp b/test/spinlock_pool_mt_test.cpp new file mode 100644 index 0000000..d9f13df --- /dev/null +++ b/test/spinlock_pool_mt_test.cpp @@ -0,0 +1,41 @@ +// Copyright 2018, 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +static int count = 0; + +void f( int n ) +{ + for( int i = 0; i < n; ++i ) + { + boost::detail::spinlock_pool<0>::scoped_lock lock( &count ); + ++count; + } +} + +int main() +{ + int const N = 100000; // iterations + int const M = 8; // threads + + boost::detail::lw_thread_t th[ M ] = {}; + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + BOOST_TEST_EQ( count, N * M ); + + return boost::report_errors(); +} diff --git a/test/weak_ptr_mt_test.cpp b/test/weak_ptr_mt_test.cpp new file mode 100644 index 0000000..d4a5a37 --- /dev/null +++ b/test/weak_ptr_mt_test.cpp @@ -0,0 +1,74 @@ +// Copyright 2018, 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include +#include + +static boost::shared_ptr sp( new int ); +static boost::weak_ptr wp( sp ); + +void f1( int n ) +{ + for( int i = 0; i < n; ++i ) + { + boost::weak_ptr p1( wp ); + + BOOST_TEST( !wp.expired() ); + BOOST_TEST( wp.lock() != 0 ); + } +} + +void f2( int n ) +{ + for( int i = 0; i < n; ++i ) + { + boost::weak_ptr p1( wp ); + + BOOST_TEST( wp.expired() ); + BOOST_TEST( wp.lock() == 0 ); + } +} + +int main() +{ + int const N = 100000; // iterations + int const M = 8; // threads + + boost::detail::lw_thread_t th[ M ] = {}; + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f1, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + BOOST_TEST_EQ( sp.use_count(), 1 ); + BOOST_TEST_EQ( wp.use_count(), 1 ); + + sp.reset(); + + BOOST_TEST_EQ( sp.use_count(), 0 ); + BOOST_TEST_EQ( wp.use_count(), 0 ); + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_create( th[ i ], boost::bind( f2, N ) ); + } + + for( int i = 0; i < M; ++i ) + { + boost::detail::lw_thread_join( th[ i ] ); + } + + wp.reset(); + + return boost::report_errors(); +}