C++ Boost无锁队列正在触发叮当声';s螺纹消毒剂

C++ Boost无锁队列正在触发叮当声';s螺纹消毒剂,c++,c++11,boost,queue,lock-free,C++,C++11,Boost,Queue,Lock Free,我使用1.68版创建了一个无锁对象池。虽然它似乎工作正常,但我在函数pop()中不断从clang的线程消毒剂中得到这些警告 这是: 我不知道该如何应对,但我该有多担心呢?这是boost中的bug还是消毒剂?或者可能是我做错了什么?什么类型是“索引”@Surt您可以在我提供的源代码链接中看到它类型定义boost::uint16\u t索引。我的直觉是,它应该是一个原子,因为它计算一些自由列表,尝试将其更改为原子类型,看看消毒剂是否满意。这里已经提到了,但我认为答案是错误的。事情似乎没那么简单。将其

我使用1.68版创建了一个无锁对象池。虽然它似乎工作正常,但我在函数
pop()
中不断从clang的线程消毒剂中得到这些警告

这是:


我不知道该如何应对,但我该有多担心呢?这是boost中的bug还是消毒剂?或者可能是我做错了什么?

什么类型是“索引”@Surt您可以在我提供的源代码链接中看到它<代码>类型定义boost::uint16\u t索引。我的直觉是,它应该是一个原子,因为它计算一些自由列表,尝试将其更改为原子类型,看看消毒剂是否满意。这里已经提到了,但我认为答案是错误的。事情似乎没那么简单。将其更改为
boost::atomic
会导致大量编译错误。@PeterCordes-在调试器下很容易重现。我们所需要的一切——推送至少一个元素到队列,以及在并发调用pop中的两个线程(需要在调试器下控制线程执行)。我们需要的第一个线程在此之后停止,让另一个线程调用pop。在它执行L418之后,我们可以挂起它并恢复第一个线程<代码>头部ptr已被第二个线程“释放”
WARNING: ThreadSanitizer: data race (pid=32452)
  Write of size 2 at 0x7b4400081e00 by thread T54 (mutexes: write M3349, write M3517):
    #0 boost::lockfree::detail::tagged_index::set_index(unsigned short) /opt/boost/boost/lockfree/detail/freelist.hpp:292:15 (Exchange-tests+0xb37c09)
    #1 boost::lockfree::detail::fixed_size_freelist<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, boost::lockfree::detail::runtime_sized_freelist_storage<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, std::allocator<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node> > >::deallocate_impl(unsigned short) /opt/boost/boost/lockfree/detail/freelist.hpp:592:33 (Exchange-tests+0xb3c31f)
    #2 void boost::lockfree::detail::fixed_size_freelist<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, boost::lockfree::detail::runtime_sized_freelist_storage<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, std::allocator<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node> > >::deallocate<true>(unsigned short) /opt/boost/boost/lockfree/detail/freelist.hpp:580:13 (Exchange-tests+0xb3c23b)
    #3 void boost::lockfree::detail::fixed_size_freelist<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, boost::lockfree::detail::runtime_sized_freelist_storage<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node, std::allocator<boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::node> > >::destruct<true>(boost::lockfree::detail::tagged_index) /opt/boost/boost/lockfree/detail/freelist.hpp:478:9 (Exchange-tests+0xb3c1d7)
    #4 bool boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::pop<unsigned long>(unsigned long&) /opt/boost/boost/lockfree/queue.hpp:418:39 (Exchange-tests+0xb3c102)
    #5 boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::pop(unsigned long&) /opt/boost/boost/lockfree/queue.hpp:375:16 (Exchange-tests+0xb3bda8)
    #6 ObjectPool<MarketsController>::borrowObj() 
...

  Previous atomic read of size 4 at 0x7b4400081e00 by thread T52 (mutexes: write M3339, write M3518):
    #0 __tsan_atomic32_load /tmp/final/llvm.src/projects/compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cc:535:3 (Exchange-tests+0x503e11)
    #1 std::atomic<boost::lockfree::detail::tagged_index>::load(std::memory_order) const /usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/atomic:250:2 (Exchange-tests+0xb37e97)
    #2 bool boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::pop<unsigned long>(unsigned long&) /opt/boost/boost/lockfree/queue.hpp:394:54 (Exchange-tests+0xb3beca)
    #3 boost::lockfree::queue<unsigned long, boost::lockfree::fixed_sized<true> >::pop(unsigned long&) /opt/boost/boost/lockfree/queue.hpp:375:16 (Exchange-tests+0xb3bda8)
    #4 ObjectPool<MController>::borrowObj() 
...
void set_index(index_t i)
{
    index = i; // this line
}
tagged_node_handle next = head_ptr->next.load(memory_order_acquire);