From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id CE93A385841F; Mon, 9 Aug 2021 07:47:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CE93A385841F From: "tobias.schmidt at in dot tum.de" To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/101825] New: Atomic wait returns without the value having changed Date: Mon, 09 Aug 2021 07:47:30 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: libstdc++ X-Bugzilla-Version: 11.1.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: tobias.schmidt at in dot tum.de X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Aug 2021 07:47:30 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D101825 Bug ID: 101825 Summary: Atomic wait returns without the value having changed Product: gcc Version: 11.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: tobias.schmidt at in dot tum.de Target Milestone: --- We noticed a possible bug in gcc for std::atomic::wait, where the functi= on returns with the atomic still having the old value. The following combination of notify_all and wait is used to execute initialization code in one thread while the other threads wait: auto expected =3D Empty; // Only one thread should do the initialization if (state.compare_exchange_strong(expected, Initialize)) { // Do some work state.store(Ready); state.notify_all(); } // Other threads wait here state.wait(Initialize); State is a 8-bit atomic value initialized with Empty and it's value always changes from Empty to Initialize and then to Ready. Except the given code snippet we never write to the value. Very rarely one of the waiting threads leaves the wait function while the s= tate value is still Initialize. The bug seems to depend on the time it takes to perform the work, i.e., how long the other threads have to wait. Therefore,= we were not able to reproduce the bug in a smaller example. However, replacing state.wait(Initialize) with=20 while (variant.state.load() =3D=3D Initialize) {} solves the problem. Thus, we suspect that the wait function returns at some point without checking the state's value first. GCC Version: Using built-in specs. COLLECT_GCC=3Dgcc-11 COLLECT_LTO_WRAPPER=3D/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMES=3Dnvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT=3D1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion=3D'Ubuntu 11.1.0-1ubuntu1~21.04' --with-bugurl=3Dfile:///usr/share/doc/gcc-11/README.= Bugs --enable-languages=3Dc,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix= =3D/usr --with-gcc-major-version-only --program-suffix=3D-11 --program-prefix=3Dx86_64-linux-gnu- --enable-shared --enable-linker-build-= id --libexecdir=3D/usr/lib --without-included-gettext --enable-threads=3Dposix --libdir=3D/usr/lib --enable-nls --enable-bootstrap --enable-clocale=3Dgnu --enable-libstdcxx-debug --enable-libstdcxx-time=3Dyes --with-default-libstdcxx-abi=3Dnew --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-= zlib --enable-libphobos-checking=3Drelease --with-target-system-zlib=3Dauto --enable-objc-gc=3Dauto --enable-multiarch --disable-werror --enable-cet --with-arch-32=3Di686 --with-abi=3Dm64 --with-multilib-list=3Dm32,m64,mx32 --enable-multilib --with-tune=3Dgeneric --enable-offload-targets=3Dnvptx-none=3D/build/gcc-11-RPS7jb/gcc-11-11.1.0/= debian/tmp-nvptx/usr,amdgcn-amdhsa=3D/build/gcc-11-RPS7jb/gcc-11-11.1.0/deb= ian/tmp-gcn/usr --without-cuda-driver --enable-checking=3Drelease --build=3Dx86_64-linux-gnu --host=3Dx86_64-linux-gnu --target=3Dx86_64-linux-gnu --with-build-config=3Dbootstrap-lto-lean --enable-link-serialization=3D2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.1.0 (Ubuntu 11.1.0-1ubuntu1~21.04)=