#pragma once #include #include #include #include #include namespace NThreading::NTest { namespace NPrivate { void ExecuteAndWait(TVector> jobs, TFuture waiter, size_t threads); template void SetConcurrentAndWait(TPromises&& promises, FSetter&& setter, TFuture waiter, size_t threads = 8) { TVector> jobs; jobs.reserve(std::size(promises)); for (auto& p : promises) { jobs.push_back([p, setter]() mutable {setter(p); }); } ExecuteAndWait(std::move(jobs), std::move(waiter), threads); } template auto MakePromise() { if constexpr (std::is_same_v) { return NewPromise(); } return NewPromise(); } } template void TestManyStress(FWaiterFactory&& waiterFactory, FSetterFactory&& setterFactory, FChecker&& checker) { for (size_t i : { 1, 2, 4, 8, 16, 32, 64, 128, 256 }) { TVector> promises; TVector> futures; promises.reserve(i); futures.reserve(i); for (size_t j = 0; j < i; ++j) { auto promise = NPrivate::MakePromise(); futures.push_back(promise.GetFuture()); promises.push_back(std::move(promise)); } auto waiter = waiterFactory(futures); NPrivate::SetConcurrentAndWait(std::move(promises), [valueSetter = setterFactory(i)](auto&& p) { valueSetter(p); } , waiter); checker(waiter); } } }