pika icon indicating copy to clipboard operation
pika copied to clipboard

Lockfree queues have data races

Open msimberg opened this issue 1 year ago • 0 comments

It's unclear if these are false positives, or real. E.g. (in nearly any test using the pika schedulers, both deque and MoodyCamel queue):

WARNING: ThreadSanitizer: data race (pid=3631945)
  Atomic read of size 8 at 0x7b0c00003548 by thread T1:
    #0 std::atomic<boost::lockfree::detail::tagged_ptr<pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*> > >::load(std::memory_order) const /nix/store/qfqjymymsd2x29yknsgllfiq1h64s3f4-gcc-12.3.0/include/c++/12.3.0/atomic:285 (libpikad.so.0+0x5bea14)
    #1 pika::concurrency::detail::deque<pika::threads::detail::thread_data*, pika::concurrency::detail::caching_freelist_t, pika::detail::aligned_allocator<pika::threads::detail::thread_data*> >::stabilize_left(pika::concurrency::detail::tagged_ptr_pair<pika::concurrency::detail::deque_node<pika::threads:
:detail::thread_data*>, pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*> >&) /home/mjs/src/pika/libs/pika/concurrency/include/pika/concurrency/deque.hpp:260 (libpikad.so.0+0x5c01e2)
    #2 pika::concurrency::detail::deque<pika::threads::detail::thread_data*, pika::concurrency::detail::caching_freelist_t, pika::detail::aligned_allocator<pika::threads::detail::thread_data*> >::push_left(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/concurrency/include/pika/concurren
cy/deque.hpp:393 (libpikad.so.0+0x5e64ec)
    #3 pika::threads::detail::lockfree_lifo_backend<pika::threads::detail::thread_data*>::push(pika::threads::detail::thread_data* const&, bool) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/lockfree_queue_backends.hpp:144 (libpikad.so.0+0x5e5ed6)
    #4 pika::threads::detail::thread_queue<std::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo>::destroy_thread(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/thread_queue.hpp:790
 (libpikad.so.0+0x50cb8d)
    #5 pika::threads::detail::local_priority_queue_scheduler<std::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo>::destroy_thread(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/lo
cal_priority_queue_scheduler.hpp:682 (libpikad.so.0+0x53046a)
    #6 pika::threads::detail::thread_data::destroy_thread() /home/mjs/src/pika/libs/pika/threading_base/src/thread_data.cpp:94 (libpikad.so.0+0x6ab082)
    #7 pika::threads::detail::intrusive_ptr_release(pika::threads::detail::thread_data_reference_counting*) /home/mjs/src/pika/libs/pika/coroutines/include/pika/coroutines/thread_id_type.hpp:165 (channel_mpmc_shift_test+0x119900)
    #8 pika::memory::intrusive_ptr<pika::threads::detail::thread_data_reference_counting>::~intrusive_ptr() /home/mjs/src/pika/libs/pika/memory/include/pika/memory/intrusive_ptr.hpp:82 (channel_mpmc_shift_test+0x11980c)
    #9 pika::memory::intrusive_ptr<pika::threads::detail::thread_data_reference_counting>::reset(pika::threads::detail::thread_data_reference_counting*) /home/mjs/src/pika/libs/pika/memory/include/pika/memory/intrusive_ptr.hpp:138 (libpikad.so.0+0x5c626e)
    #10 pika::threads::detail::thread_id_ref::operator=(pika::threads::detail::thread_id&&) /home/mjs/src/pika/libs/pika/coroutines/include/pika/coroutines/thread_id_type.hpp:240 (libpikad.so.0+0x5f2775)
    #11 void pika::threads::detail::scheduling_loop<pika::threads::detail::local_priority_queue_scheduler<std::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo> >(unsigned long, pika::threads::detail::local_priority_queue_scheduler<std
::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo>&, pika::threads::detail::scheduling_counters&, pika::threads::detail::scheduling_callbacks&) /home/mjs/src/pika/libs/pika/thread_pools/include/pika/thread_pools/scheduling_loop.hpp:59
0 (libpikad.so.0+0x53dfbe)
    #12 void pika::then_detail::tag_invoke<int, std::reference_wrapper<pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock> >, std::reference_wrapper<pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock> > >(pika::execution::experimental::set_value_t, pika:
:then_detail::then_receiver_impl<pika::execution::experimental::detail::any_receiver<int>, int (*)(int, pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock>&, pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock>&)>::then_receiver_type&&, int&&, std::refere
nce_wrapper<pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock> >&&, std::reference_wrapper<pika::experimental::bounded_channel<int, pika::concurrency::detail::spinlock> >&&) /home/mjs/src/pika/libs/pika/execution/include/pika/execution/algorithms/then.hpp:99 (channel_mpmc_shift_
test+0x118c15)
...

  Previous write of size 8 at 0x7b0c00003548 by thread T4:
    #0 __tsan_memcpy ??:? (channel_mpmc_shift_test+0x6aa79)
    #1 std::atomic<boost::lockfree::detail::tagged_ptr<pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*> > >::atomic(boost::lockfree::detail::tagged_ptr<pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*> >) /nix/store/qfqjymymsd2x29yknsgllfiq1h64s3f4-gcc-12
.3.0/include/c++/12.3.0/atomic:231 (libpikad.so.0+0x5e6c47)
    #2 pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*>::deque_node(pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*>*, pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*>*, pika::threads::detail::thread_data*&&, unsigned short, uns
igned short) /home/mjs/src/pika/libs/pika/concurrency/include/pika/concurrency/deque.hpp:78 (libpikad.so.0+0x5e684f)
    #3 pika::concurrency::detail::deque<pika::threads::detail::thread_data*, pika::concurrency::detail::caching_freelist_t, pika::detail::aligned_allocator<pika::threads::detail::thread_data*> >::alloc_node(pika::concurrency::detail::deque_node<pika::threads::detail::thread_data*>*, pika::concurrency::det
ail::deque_node<pika::threads::detail::thread_data*>*, pika::threads::detail::thread_data*&&, unsigned short, unsigned short) /home/mjs/src/pika/libs/pika/concurrency/include/pika/concurrency/deque.hpp:237 (libpikad.so.0+0x5e667d)
    #4 pika::concurrency::detail::deque<pika::threads::detail::thread_data*, pika::concurrency::detail::caching_freelist_t, pika::detail::aligned_allocator<pika::threads::detail::thread_data*> >::push_left(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/concurrency/include/pika/concurren
cy/deque.hpp:357 (libpikad.so.0+0x5e62ce)
    #5 pika::threads::detail::lockfree_lifo_backend<pika::threads::detail::thread_data*>::push(pika::threads::detail::thread_data* const&, bool) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/lockfree_queue_backends.hpp:144 (libpikad.so.0+0x5e5ed6)
    #6 pika::threads::detail::thread_queue<std::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo>::destroy_thread(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/thread_queue.hpp:790
 (libpikad.so.0+0x50cb8d)
    #7 pika::threads::detail::local_priority_queue_scheduler<std::mutex, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_fifo, pika::threads::detail::lockfree_lifo>::destroy_thread(pika::threads::detail::thread_data*) /home/mjs/src/pika/libs/pika/schedulers/include/pika/schedulers/lo
cal_priority_queue_scheduler.hpp:682 (libpikad.so.0+0x53046a)
...

These are currently suppressed in #972.

msimberg avatar Jan 22 '24 10:01 msimberg