From c8a3a6d4e3553f5248bf254f9342a444e6f9c725 Mon Sep 17 00:00:00 2001 From: robtor Date: Fri, 3 Nov 2023 11:32:02 +0100 Subject: [PATCH] Add MT merger --- task1/CMakeLists.txt | 3 ++- task1/mergesort.h | 2 +- task1/mergesort_mt.h | 48 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 task1/mergesort_mt.h diff --git a/task1/CMakeLists.txt b/task1/CMakeLists.txt index 6f70ae5..e86bafc 100644 --- a/task1/CMakeLists.txt +++ b/task1/CMakeLists.txt @@ -19,7 +19,8 @@ add_custom_target(task1_7_dataset ${CMAKE_CURRENT_BINARY_DIR}/dataset.dat) add_executable(task1_7 main.cpp - mergesort.h) + mergesort.h + mergesort_mt.h) target_link_libraries(task1_7 fmt::fmt diff --git a/task1/mergesort.h b/task1/mergesort.h index b5ad3eb..0a27d55 100644 --- a/task1/mergesort.h +++ b/task1/mergesort.h @@ -305,7 +305,7 @@ namespace algo { while (l < left.end() && r < right.end()) { if (cmp(*l, *r)) { - output.insert(o, *l); + outpbufut.insert(o, *l); l++; } else { output.insert(o, *r); diff --git a/task1/mergesort_mt.h b/task1/mergesort_mt.h new file mode 100644 index 0000000..3847c1d --- /dev/null +++ b/task1/mergesort_mt.h @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +template +class MergeSorterMT { + + C comp; + std::recursive_mutex mut; + + auto merge(std::span &output, std::span left, std::span right) -> void { + std::vector buf; + buf.reserver(left.size() + right.size()); + + auto l = left.begin(); + auto r = right.begin(); + auto o = buf.begin(); + + hile (l < left.end() && r < right.end()) { + if (cmp(*l, *r)) { + buf.insert(o, *l); + l++; + } else { + buf.insert(o, *r); + r++; + } + o++; + } + while (l < left.end()) { + buf.insert(o, *l); + o++; + l++; + } + while (r < right.end()) { + buf.insert(o, *r); + o++; + r++; + } + + { + std::lock_guard lock(mut); + std::move(buf.begin(), buf.end(), output.begin()); + } + } + + +}; \ No newline at end of file