|
|
@ -360,25 +360,28 @@ TEST(AtomicWakerTest, ThreadStress) { |
|
|
|
AtomicWaker waker; |
|
|
|
AtomicWaker waker; |
|
|
|
|
|
|
|
|
|
|
|
threads.reserve(90); |
|
|
|
threads.reserve(90); |
|
|
|
for (int i = 0; i < 30; i++) { |
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
threads.emplace_back([&] { |
|
|
|
threads.emplace_back([&] { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
waker.Wakeup(); |
|
|
|
waker.Wakeup(); |
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
for (int i = 0; i < 30; i++) { |
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
threads.emplace_back([&] { |
|
|
|
threads.emplace_back([&] { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
waker.Set(Waker(new TestWakeable(&wakeups, &drops))); |
|
|
|
waker.Set(Waker(new TestWakeable(&wakeups, &drops))); |
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
for (int i = 0; i < 30; i++) { |
|
|
|
for (int i = 0; i < 5; i++) { |
|
|
|
threads.emplace_back([&] { |
|
|
|
threads.emplace_back([&] { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
while (!done.load(std::memory_order_relaxed)) { |
|
|
|
(waker.Armed() ? &armed : ¬_armed) |
|
|
|
(waker.Armed() ? &armed : ¬_armed) |
|
|
|
->fetch_add(1, std::memory_order_relaxed); |
|
|
|
->fetch_add(1, std::memory_order_relaxed); |
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|