[llvm] [Support] Join threads when stopping the ThreadPoolExecutor (PR #166054)
Maurice Heumann via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 2 03:53:44 PST 2025
https://github.com/momo5502 updated https://github.com/llvm/llvm-project/pull/166054
>From f2907665dd3e0a0c839bbf9301aa7532548ee593 Mon Sep 17 00:00:00 2001
From: momo5502 <mauriceheumann at gmail.com>
Date: Sun, 2 Nov 2025 11:56:45 +0100
Subject: [PATCH] [Support] Join threads when stopping ThreadPoolExecutor
---
llvm/lib/Support/Parallel.cpp | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Support/Parallel.cpp b/llvm/lib/Support/Parallel.cpp
index 8e0c724accb36..e20e6af262fc6 100644
--- a/llvm/lib/Support/Parallel.cpp
+++ b/llvm/lib/Support/Parallel.cpp
@@ -83,25 +83,31 @@ class ThreadPoolExecutor : public Executor {
void stop() {
{
- std::lock_guard<std::mutex> Lock(Mutex);
- if (Stop)
+ std::unique_lock<std::mutex> Lock(Mutex);
+ if (Stop && Threads.empty())
return;
Stop = true;
}
+
Cond.notify_all();
ThreadsCreated.get_future().wait();
- }
- ~ThreadPoolExecutor() override {
- stop();
+ std::vector<std::thread> ThreadsToJoin;
+ {
+ std::unique_lock<std::mutex> Lock(Mutex);
+ ThreadsToJoin.swap(Threads);
+ }
+
std::thread::id CurrentThreadId = std::this_thread::get_id();
- for (std::thread &T : Threads)
+ for (std::thread &T : ThreadsToJoin)
if (T.get_id() == CurrentThreadId)
T.detach();
else
T.join();
}
+ ~ThreadPoolExecutor() override { stop(); }
+
struct Creator {
static void *call() { return new ThreadPoolExecutor(strategy); }
};
More information about the llvm-commits
mailing list