TSan 在 Boost 无锁队列中报告数据竞争

2023-12-26

我在跑boost 无锁队列文档中给出的 MPMC 示例 https://www.boost.org/doc/libs/1_79_0/doc/html/lockfree/examples.html使用线程清理程序,令我惊讶的是,这个基本示例包含按照 TSan 的数据竞争。知道可能出了什么问题吗?

OS: Red Hat Enterprise Linux Server release 7.7 / Ubuntu 18.04.4
Compiler: g++ (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2) / g++ (Ubuntu 11.1.0-1ubuntu-18.04.1) 11.1.0
CPU Architecture: x86_64
Boost Version: 1.79

TSan 的输出如下:

@vishal: g++ testQ.cpp -lboost_thread -L /usr/local/lib/ -pthread -fsanitize=thread -ggdb3 -fPIE -pie 

@vishal: TSAN_OPTIONS="history_size=7" ./a.out 

boost::lockfree::queue is lockfree
==================
WARNING: ThreadSanitizer: data race (pid=22019)
  Atomic write of size 8 at 0x7b1000001c00 by thread T1:
    #0 __tsan_atomic64_store <null> (libtsan.so.0+0x800ca)
    #1 std::atomic<boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> >::store(boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>, std::memory_order) /usr/include/c++/11/atomic:271 (a.out+0x110a3)
    #2 boost::lockfree::queue<int>::node::node(int const&, boost::lockfree::queue<int>::node*) /usr/local/include/boost/lockfree/queue.hpp:125 (a.out+0x12639)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:105 (a.out+0x11125)
    #4 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #5 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #6 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #7 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #8 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Previous read of size 8 at 0x7b1000001c00 by thread T4:
    #0 boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::extract_ptr(unsigned long const volatile&) /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:44 (a.out+0x12470)
    #1 boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::get_ptr() const /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:115 (a.out+0x10f28)
    #2 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate_impl<false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:193 (a.out+0x12f7e)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate<true, false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:171 (a.out+0x124ba)
    #4 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:103 (a.out+0x110e4)
    #5 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #6 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #7 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #8 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #9 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Location is heap block of size 64 at 0x7b1000001c00 allocated by main thread:
    #0 posix_memalign <null> (libtsan.so.0+0x31add)
    #1 boost::alignment::aligned_alloc(unsigned long, unsigned long) /usr/local/include/boost/align/detail/aligned_alloc_posix.hpp:26 (a.out+0xcd82)
    #2 boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul>::allocate(unsigned long, void const*) /usr/local/include/boost/align/aligned_allocator.hpp:70 (a.out+0x10d62)
    #3 boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_stack<boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >(boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> const&, unsigned long) /usr/local/include/boost/lockfree/detail/freelist.hpp:62 (a.out+0xfb20)
    #4 boost::lockfree::queue<int>::queue(unsigned long) /usr/local/include/boost/lockfree/queue.hpp:234 (a.out+0xe525)
    #5 __static_initialization_and_destruction_0 /home/vishal/coding/c++/testQ.cpp:10 (a.out+0x68af)
    #6 _GLOBAL__sub_I_producer_count /home/vishal/coding/c++/testQ.cpp:61 (a.out+0x6911)
    #7 __libc_csu_init <null> (a.out+0x1470c)

  Thread T1 (tid=22021, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

  Thread T4 (tid=22024, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

SUMMARY: ThreadSanitizer: data race (/usr/lib/x86_64-linux-gnu/libtsan.so.0+0x800ca) in __tsan_atomic64_store
==================
==================
WARNING: ThreadSanitizer: data race (pid=22019)
  Read of size 8 at 0x7b100000f400 by thread T2:
    #0 boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::extract_ptr(unsigned long const volatile&) /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:44 (a.out+0x12470)
    #1 boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::get_ptr() const /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:115 (a.out+0x10f28)
    #2 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate_impl<false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:193 (a.out+0x12f7e)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate<true, false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:171 (a.out+0x124ba)
    #4 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:103 (a.out+0x110e4)
    #5 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #6 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #7 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #8 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #9 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Previous atomic write of size 8 at 0x7b100000f400 by thread T4:
    #0 __tsan_atomic64_compare_exchange_strong <null> (libtsan.so.0+0x8608d)
    #1 std::atomic<boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> >::compare_exchange_weak(boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>&, boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>, std::memory_order, std::memory_order) /usr/include/c++/11/atomic:323 (a.out+0x1276a)
    #2 std::atomic<boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> >::compare_exchange_weak(boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>&, boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>, std::memory_order) /usr/include/c++/11/atomic:342 (a.out+0x11347)
    #3 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:342 (a.out+0xfee4)
    #4 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #5 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #6 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #7 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Location is heap block of size 64 at 0x7b100000f400 allocated by thread T2:
    #0 posix_memalign <null> (libtsan.so.0+0x31add)
    #1 boost::alignment::aligned_alloc(unsigned long, unsigned long) /usr/local/include/boost/align/detail/aligned_alloc_posix.hpp:26 (a.out+0xcd82)
    #2 boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul>::allocate(unsigned long, void const*) /usr/local/include/boost/align/aligned_allocator.hpp:70 (a.out+0x10d62)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate_impl<false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:185 (a.out+0x12f4a)
    #4 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate<true, false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:171 (a.out+0x124ba)
    #5 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:103 (a.out+0x110e4)
    #6 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #7 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #8 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #9 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #10 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Thread T2 (tid=22022, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

  Thread T4 (tid=22024, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

SUMMARY: ThreadSanitizer: data race /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:44 in boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::extract_ptr(unsigned long const volatile&)
==================
==================
WARNING: ThreadSanitizer: data race (pid=22019)
  Write of size 8 at 0x7b1000051c00 by thread T6:
    #0 boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::set_ptr(boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node*) /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:121 (a.out+0x12dfb)
    #1 boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::deallocate_impl(boost::lockfree::queue<int>::node*) /usr/local/include/boost/lockfree/detail/freelist.hpp:245 (a.out+0x12304)
    #2 void boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::deallocate<true>(boost::lockfree::queue<int>::node*) /usr/local/include/boost/lockfree/detail/freelist.hpp:231 (a.out+0x12895)
    #3 void boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::destruct<true>(boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:114 (a.out+0x1147f)
    #4 bool boost::lockfree::queue<int>::pop<int>(int&) /usr/local/include/boost/lockfree/queue.hpp:442 (a.out+0x101fa)
    #5 boost::lockfree::queue<int>::pop(int&) /usr/local/include/boost/lockfree/queue.hpp:399 (a.out+0xe601)
    #6 consumer() /home/vishal/coding/c++/testQ.cpp:30 (a.out+0x5e48)
    #7 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #8 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Previous atomic read of size 8 at 0x7b1000051c00 by thread T5:
    #0 __tsan_atomic64_load <null> (libtsan.so.0+0x7f4ea)
    #1 std::atomic<boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> >::load(std::memory_order) const /usr/include/c++/11/atomic:285 (a.out+0x111b1)
    #2 bool boost::lockfree::queue<int>::pop<int>(int&) /usr/local/include/boost/lockfree/queue.hpp:418 (a.out+0x10054)
    #3 boost::lockfree::queue<int>::pop(int&) /usr/local/include/boost/lockfree/queue.hpp:399 (a.out+0xe601)
    #4 consumer() /home/vishal/coding/c++/testQ.cpp:30 (a.out+0x5e48)
    #5 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #6 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Location is heap block of size 64 at 0x7b1000051c00 allocated by thread T1:
    #0 posix_memalign <null> (libtsan.so.0+0x31add)
    #1 boost::alignment::aligned_alloc(unsigned long, unsigned long) /usr/local/include/boost/align/detail/aligned_alloc_posix.hpp:26 (a.out+0xcd82)
    #2 boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul>::allocate(unsigned long, void const*) /usr/local/include/boost/align/aligned_allocator.hpp:70 (a.out+0x10d62)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate_impl<false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:185 (a.out+0x12f4a)
    #4 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate<true, false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:171 (a.out+0x124ba)
    #5 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:103 (a.out+0x110e4)
    #6 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #7 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #8 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #9 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #10 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Thread T6 (tid=22026, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:52 (a.out+0x6243)

  Thread T5 (tid=22025, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:52 (a.out+0x6243)

  Thread T1 (tid=22021, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

SUMMARY: ThreadSanitizer: data race /usr/local/include/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp:121 in boost::lockfree::detail::tagged_ptr<boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node>::set_ptr(boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::freelist_node*)
==================
==================
WARNING: ThreadSanitizer: data race (pid=22019)
  Write of size 4 at 0x7b1000051f88 by thread T3:
    #0 boost::lockfree::queue<int>::node::node(int const&, boost::lockfree::queue<int>::node*) /usr/local/include/boost/lockfree/queue.hpp:120 (a.out+0x125e3)
    #1 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:105 (a.out+0x11125)
    #2 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #3 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #4 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #5 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #6 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Previous read of size 4 at 0x7b1000051f88 by thread T8:
    #0 void boost::lockfree::detail::copy_convertible::copy<int, int>(int&, int&) /usr/local/include/boost/lockfree/detail/copy_payload.hpp:29 (a.out+0x12840)
    #1 void boost::lockfree::detail::copy_payload<int, int>(int&, int&) /usr/local/include/boost/lockfree/detail/copy_payload.hpp:49 (a.out+0x11437)
    #2 bool boost::lockfree::queue<int>::pop<int>(int&) /usr/local/include/boost/lockfree/queue.hpp:438 (a.out+0x10182)
    #3 boost::lockfree::queue<int>::pop(int&) /usr/local/include/boost/lockfree/queue.hpp:399 (a.out+0xe601)
    #4 consumer() /home/vishal/coding/c++/testQ.cpp:30 (a.out+0x5e48)
    #5 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #6 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Location is heap block of size 64 at 0x7b1000051f80 allocated by thread T1:
    #0 posix_memalign <null> (libtsan.so.0+0x31add)
    #1 boost::alignment::aligned_alloc(unsigned long, unsigned long) /usr/local/include/boost/align/detail/aligned_alloc_posix.hpp:26 (a.out+0xcd82)
    #2 boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul>::allocate(unsigned long, void const*) /usr/local/include/boost/align/aligned_allocator.hpp:70 (a.out+0x10d62)
    #3 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate_impl<false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:185 (a.out+0x12f4a)
    #4 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::allocate<true, false>() /usr/local/include/boost/lockfree/detail/freelist.hpp:171 (a.out+0x124ba)
    #5 boost::lockfree::queue<int>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<int>::node, boost::alignment::aligned_allocator<boost::lockfree::queue<int>::node, 64ul> >::construct<true, false, int, boost::lockfree::queue<int>::node*>(int const&, boost::lockfree::queue<int>::node* const&) /usr/local/include/boost/lockfree/detail/freelist.hpp:103 (a.out+0x110e4)
    #6 bool boost::lockfree::queue<int>::do_push<false>(int const&) /usr/local/include/boost/lockfree/queue.hpp:326 (a.out+0xfdc4)
    #7 boost::lockfree::queue<int>::push(int const&) /usr/local/include/boost/lockfree/queue.hpp:304 (a.out+0xe5ab)
    #8 producer() /home/vishal/coding/c++/testQ.cpp:20 (a.out+0x5c3a)
    #9 boost::detail::thread_data<void (*)()>::run() /usr/local/include/boost/thread/detail/thread.hpp:120 (a.out+0x13c67)
    #10 thread_proxy <null> (libboost_thread.so.1.79.0+0xa646)

  Thread T3 (tid=22023, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

  Thread T8 (tid=22028, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:52 (a.out+0x6243)

  Thread T1 (tid=22021, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x5fe84)
    #1 boost::thread::start_thread_noexcept() <null> (libboost_thread.so.1.79.0+0x98cc)
    #2 boost::thread::thread<void (*&)()>(void (*&)()) /usr/local/include/boost/thread/detail/thread.hpp:269 (a.out+0x102d9)
    #3 boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) /usr/local/include/boost/thread/detail/thread_group.hpp:79 (a.out+0xe6f2)
    #4 main /home/vishal/coding/c++/testQ.cpp:49 (a.out+0x620e)

SUMMARY: ThreadSanitizer: data race /usr/local/include/boost/lockfree/queue.hpp:120 in boost::lockfree::queue<int>::node::node(int const&, boost::lockfree::queue<int>::node*)
==================

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TSan 在 Boost 无锁队列中报告数据竞争 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 我们可以关闭终结器吗?

    由于无法保证终结器何时运行以及是否会运行 而且如今终结器几乎被认为是一种气味 有什么方法可以说服 JVM 完全跳过所有终结过程吗 我问这个问题是因为我们有一个庞大的应用程序 当它迁移到较新的 JVM 现阶段不确定是哪个 时 它会因为看起来非
  • twig - 在 for 循环中构建数组

    是否可以迭代地用值填充树枝数组 for question in questions set multipleChoiceArray for multipleChoice in question multipleChoiceAnswers s
  • 如何构建正确的 SPARQL 查询

    我需要使用 SPARQL 查询和 dbpedia org 获取曾经为足球队效力过的所有球员 我可以让当前的团队成员使用http dbpedia org sparql http dbpedia org sparql和这个查询 PREFIX g
  • Shiny/R 错误:路径应该是项目目录中的文件

    我的 Shiny 应用程序将在本地运行 但当我尝试部署到shinyapps io 时 它不会运行 我通过删除路径中的 点 暂时解决了该问题 csv file data lt read csv Users JMJC Desktop bbtea
  • MongoDB:更新/更新插入与插入

    最近我注意到多次更新插入之间存在巨大的性能差异 通过批量操作 https docs mongodb org manual core bulk write operations 与插入 多个文档 我想知道我的说法是否正确 更新插入 更新就像f
  • 图像方向 - Android

    在过去一个月左右的时间里 我一直断断续续地与这个错误作斗争 每当我认为我已经解决了它 它似乎就会以某种形式回来 这是旧的 Android 图像旋转 90 度 错误 我在这里阅读了无数的帖子 StackOverFlow 并尝试了多种方法 但似
  • 将 [String: AnyObject] 转换为 [String: Any] [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个 String AnyObject 类型的 Swift 变量 但是我尝试调用的函数需要一个 String Any
  • shebang 标志与 set 内置标志之间的区别

    在 shebang 行上传递给脚本的标志与使用set内置 例如 bin bash e do stuff vs bin bash set e do stuff 这个问题并不具体针对 e标志 但一般来说对于任何此类标志 显然set flags
  • WCF 服务默认值

    我的 WCF 服务有以下数据协定类 DataContract Name MyClassDTO public class MyClass private string name Default Name DataMember public s
  • 如何强制仅匿名访问控制器操作?

    我可以使用 AllowAnonymous 属性允许用户访问控制器操作 但是是否有属性只允许匿名用户访问操作 例如 AllowAnonymousOnly 不 它不存在 但是 您可以通过创建自己的属性来创建它 该属性继承自授权属性 https
  • 使用原始类型进行模乘的方法

    有没有办法构建例如 853467 21660421200929 100000000000007没有 BigInteger 库 请注意 每个数字都适合 64 位整数 但乘法结果不适合 这个解决方案似乎效率低下 int64 t mulmod i
  • Scala 集合上的高效分组聚合

    我经常需要做类似的事情 coll groupBy f mapValues foldLeft x g 达到相同效果但避免显式构造中间集合的最佳方法是什么groupBy 您可以将初始集合折叠在保存中间结果的地图上 def groupFold A
  • 如何在 Action 运行的 Bash 脚本中访问 GitHub Action 环境变量?

    我无法从操作运行的脚本中访问在 GitHub 操作配置文件顶层定义的环境变量 例如 给定以下配置文件 name x pull request on pull request env FOO bar jobs test runs on ubu
  • 为什么我仍然看到发布者未知并出现 UAC 提示?

    我制作了自己的 CA 然后制作了 pfx 文件 我正在使用 Wix 工具集来构建安装程序 在 wix 项目文件中 我使用以下内容对其进行了编辑
  • 将 Func 委托转换为字符串

    有没有办法将现有的 Func 委托转换为这样的字符串 Func
  • 错误:Kotlin:不支持的插件选项:org.jetbrains.kotlin.android:enabled=true

    今天我收到此错误 而一小时前完全相同的代码正在运行 错误 Kotlin 不支持的插件选项 org jetbrains kotlin android enabled true 并且这个项目不运行 原因 重复条目 更新 从用户文件夹中删除 An
  • Java 优化字符串与字符数组

    在我正在编写的程序中 我正在进行大量的字符串操作 我正在尝试提高性能 并且想知道使用 char 数组是否会显示出不错的性能提升 有什么建议么 你在做什么操纵 您可以发布代码示例吗 您可能想看一下字符串生成器 http java sun co
  • 用于切换功能和启用/禁用的变量

    正如我之前的问题一样 我正在制作一个巨魔功能 现在我正在尝试弄清楚如何让它切换以使其工作 这样我的朋友就不必时不时地禁止它 切换命令可以工作 但它实际上在内部不起作用 注意 我有两个不和谐帐户 因此我可以在另一个帐户上进行测试 使用切换开关
  • Flink - 多源集成测试

    我有一份 Flink 工作 正在使用此处描述的方法进行集成测试 https ci apache org projects flink flink docs stable dev stream testing html integration
  • TSan 在 Boost 无锁队列中报告数据竞争

    我在跑boost 无锁队列文档中给出的 MPMC 示例 https www boost org doc libs 1 79 0 doc html lockfree examples html使用线程清理程序 令我惊讶的是 这个基本示例包含按