commit 3efdfe612ec7aaf252f6391b4d29bbf46118eced (tree)
parent ffd53a459e1b665e5070987f68dd583171a12459
Author: Andrew Kelley <andrew@ziglang.org>
Date: Wed, 6 Mar 2024 22:25:35 -0700
std.Thread.WaitGroup: add spawnManaged
Provides a convenient way to spawn a new thread that bypasses a thread
pool. Appropriate when the spawned thread delegates all of its work.
Diffstat:
1 file changed, 22 insertions(+), 0 deletions(-)
diff --git a/lib/std/Thread/WaitGroup.zig b/lib/std/Thread/WaitGroup.zig
@@ -1,3 +1,4 @@
+const builtin = @import("builtin");
const std = @import("std");
const assert = std.debug.assert;
const WaitGroup = @This();
@@ -43,3 +44,24 @@ pub fn isDone(wg: *WaitGroup) bool {
return (state / one_pending) == 0;
}
+
+// Spawns a new thread for the task. This is appropriate when the callee
+// delegates all work.
+pub fn spawnManager(
+ wg: *WaitGroup,
+ comptime func: anytype,
+ args: anytype,
+) void {
+ if (builtin.single_threaded) {
+ @call(.auto, func, args);
+ return;
+ }
+ const Manager = struct {
+ fn run(wg_inner: *WaitGroup, args_inner: @TypeOf(args)) void {
+ defer wg_inner.finish();
+ @call(.auto, func, args_inner);
+ }
+ };
+ wg.start();
+ _ = std.Thread.spawn(.{}, Manager.run, .{ wg, args }) catch Manager.run(wg, args);
+}