test(hex8): await every worker before first paired linear call
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <atomic>
|
||||||
#include <cfenv>
|
#include <cfenv>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -10,6 +11,7 @@
|
|||||||
#include <future>
|
#include <future>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <thread>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -146,13 +148,17 @@ TEST(Hex8HighLow, ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits) {
|
|||||||
ASSERT_TRUE(expected_b.HasValue());
|
ASSERT_TRUE(expected_b.HasValue());
|
||||||
std::promise<void> start;
|
std::promise<void> start;
|
||||||
const auto signal = start.get_future().share();
|
const auto signal = start.get_future().share();
|
||||||
|
std::atomic<std::size_t> arrived{0U};
|
||||||
std::array<std::future<fesa::Result<fesa::Hex8HighLowResponse>>, 4> calls;
|
std::array<std::future<fesa::Result<fesa::Hex8HighLowResponse>>, 4> calls;
|
||||||
for (std::size_t i = 0; i < calls.size(); ++i)
|
for (std::size_t i = 0; i < calls.size(); ++i)
|
||||||
calls[i] = std::async(std::launch::async, [&, i] {
|
calls[i] = std::async(std::launch::async, [&, i] {
|
||||||
|
arrived.fetch_add(1U, std::memory_order_release);
|
||||||
signal.wait();
|
signal.wait();
|
||||||
return (i % 2U == 0U ? element : moved)
|
return (i % 2U == 0U ? element : moved)
|
||||||
.EvaluateLinearHighLow(high, i < 2U ? low_a : low_b);
|
.EvaluateLinearHighLow(high, i < 2U ? low_a : low_b);
|
||||||
});
|
});
|
||||||
|
while (arrived.load(std::memory_order_acquire) != calls.size())
|
||||||
|
std::this_thread::yield();
|
||||||
start.set_value();
|
start.set_value();
|
||||||
for (std::size_t i = 0; i < calls.size(); ++i) {
|
for (std::size_t i = 0; i < calls.size(); ++i) {
|
||||||
const auto response = calls[i].get();
|
const auto response = calls[i].get();
|
||||||
|
|||||||
Reference in New Issue
Block a user