1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest.h>
#include <taskflow/taskflow.hpp>
class CustomWorkerBehavior : public tf::WorkerInterface {
public:
CustomWorkerBehavior(std::atomic<size_t>& counter, std::vector<size_t>& ids) :
_counter {counter},
_ids {ids} {
}
void scheduler_prologue(tf::Worker& wv) override {
_counter++;
std::scoped_lock lock(_mutex);
_ids.push_back(wv.id());
}
void scheduler_epilogue(tf::Worker&, std::exception_ptr) override {
_counter++;
}
std::atomic<size_t>& _counter;
std::vector<size_t>& _ids;
std::mutex _mutex;
};
void worker_interface_basics(unsigned W) {
std::atomic<size_t> counter{0};
std::vector<size_t> ids;
{
tf::Executor executor(W, tf::make_worker_interface<CustomWorkerBehavior>(counter, ids));
}
REQUIRE(counter == W*2);
REQUIRE(ids.size() == W);
std::sort(ids.begin(), ids.end(), std::less<int>{});
for(size_t i=0; i<W; i++) {
REQUIRE(ids[i] == i);
}
}
TEST_CASE("WorkerInterface.Basics.1thread" * doctest::timeout(300)) {
worker_interface_basics(1);
}
TEST_CASE("WorkerInterface.Basics.2threads" * doctest::timeout(300)) {
worker_interface_basics(2);
}
TEST_CASE("WorkerInterface.Basics.3threads" * doctest::timeout(300)) {
worker_interface_basics(3);
}
TEST_CASE("WorkerInterface.Basics.4threads" * doctest::timeout(300)) {
worker_interface_basics(4);
}
TEST_CASE("WorkerInterface.Basics.5threads" * doctest::timeout(300)) {
worker_interface_basics(5);
}
TEST_CASE("WorkerInterface.Basics.6threads" * doctest::timeout(300)) {
worker_interface_basics(6);
}
TEST_CASE("WorkerInterface.Basics.7threads" * doctest::timeout(300)) {
worker_interface_basics(7);
}
TEST_CASE("WorkerInterface.Basics.8threads" * doctest::timeout(300)) {
worker_interface_basics(8);
}
|