https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68260

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
#include <thread>

struct spin {
  void lock() {
    while (flag.test_and_set(std::memory_order_acquire))
      ;
  }

  void unlock() { flag.clear(std::memory_order_release); }

  std::atomic_flag flag = ATOMIC_FLAG_INIT;
};

int main() {
  auto counter = 0;
  spin lock;

  auto t = std::thread([&]() {
    lock.lock();
    ++counter;
    lock.unlock();
  });

  lock.lock();
  ++counter;
  lock.unlock();

  t.join();
  return 0;
}

/*
g++ -std=c++14 -fsanitize=thread -g test.cc -lpthread && ./a.out
==================
WARNING: ThreadSanitizer: data race (pid=5795)
  Read of size 4 at 0x7ffe877260dc by thread T1:
    #0 main::{lambda()#1}::operator()() const <null> (a.out+0x0000004012ff)
    #1 _M_invoke<> /usr/include/c++/5/functional:1531 (a.out+0x000000402b87)
    #2 operator() /usr/include/c++/5/functional:1520 (a.out+0x000000402a7c)
    #3 _M_run /usr/include/c++/5/thread:115 (a.out+0x00000040299a)
    #4 <null> <null> (libstdc++.so.6+0x0000000b902f)
  Previous write of size 4 at 0x7ffe877260dc by main thread:
    #0 main /home/kevg/Desktop/test.cc:25 (a.out+0x0000004013ea)
  Location is stack of main thread.
  Thread T1 (tid=5797, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x000000027aa7)
    #1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>,
void (*)()) <null> (libstdc++.so.6+0x0000000b9172)
    #2 main /home/kevg/Desktop/test.cc:22 (a.out+0x0000004013c0)
SUMMARY: ThreadSanitizer: data race ??:0 main::{lambda()#1}::operator()() const
==================
ThreadSanitizer: reported 1 warnings
*/

Reply via email to