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:
parent
10ee46adf4
commit
10522ed108
4 changed files with 20 additions and 4 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue