libstdc++: Fix some more deadlocks in tests [PR 97936]

The missed notifications fixed in r11-5383 also happen in some other
tests which have similar code.

libstdc++-v3/ChangeLog:

	PR libstdc++/97936
	* testsuite/29_atomics/atomic/wait_notify/bool.cc: Fix missed
	notifications by making the new thread wait until the parent
	thread is waiting on the condition variable.
	* testsuite/29_atomics/atomic/wait_notify/pointers.cc: Likewise.
	* testsuite/29_atomics/atomic_flag/wait_notify/1.cc: Likewise.
	* testsuite/29_atomics/atomic_ref/wait_notify.cc: Likewise.
This commit is contained in:
Jonathan Wakely 2020-11-26 12:55:47 +00:00
parent 10ee46adf4
commit 10522ed108
4 changed files with 20 additions and 4 deletions

View file

@ -36,11 +36,16 @@ main ()
std::mutex m;
std::condition_variable cv;
std::unique_lock<std::mutex> l(m);
std::atomic<bool> a(false);
std::atomic<bool> b(false);
std::thread t([&]
{
{
// This ensures we block until cv.wait(l) starts.
std::lock_guard<std::mutex> ll(m);
}
cv.notify_one();
a.wait(false);
if (a.load())
@ -48,7 +53,6 @@ main ()
b.store(true);
}
});
std::unique_lock<std::mutex> l(m);
cv.wait(l);
std::this_thread::sleep_for(100ms);
a.store(true);

View file

@ -36,6 +36,7 @@ main ()
std::mutex m;
std::condition_variable cv;
std::unique_lock<std::mutex> l(m);
long aa;
long bb;
@ -43,12 +44,15 @@ main ()
std::atomic<long*> a(nullptr);
std::thread t([&]
{
{
// This ensures we block until cv.wait(l) starts.
std::lock_guard<std::mutex> ll(m);
}
cv.notify_one();
a.wait(nullptr);
if (a.load() == &aa)
a.store(&bb);
});
std::unique_lock<std::mutex> l(m);
cv.wait(l);
std::this_thread::sleep_for(100ms);
a.store(&aa);

View file

@ -36,18 +36,22 @@ main()
std::mutex m;
std::condition_variable cv;
std::unique_lock<std::mutex> l(m);
std::atomic_flag a;
std::atomic_flag b;
std::thread t([&]
{
{
// This ensures we block until cv.wait(l) starts.
std::lock_guard<std::mutex> ll(m);
}
cv.notify_one();
a.wait(false);
b.test_and_set();
b.notify_one();
});
std::unique_lock<std::mutex> l(m);
cv.wait(l);
std::this_thread::sleep_for(100ms);
a.test_and_set();

View file

@ -37,17 +37,21 @@ Tp check_wait_notify(Tp val1, Tp val2)
std::mutex m;
std::condition_variable cv;
std::unique_lock<std::mutex> l(m);
Tp aa = val1;
std::atomic_ref<Tp> a(aa);
std::thread t([&]
{
{
// This ensures we block until cv.wait(l) starts.
std::lock_guard<std::mutex> ll(m);
}
cv.notify_one();
a.wait(val1);
if (a.load() != val2)
a = val1;
});
std::unique_lock<std::mutex> l(m);
cv.wait(l);
std::this_thread::sleep_for(100ms);
a.store(val2);