启动短期线程
本示例使用 std.Thread 进行并发和并行编程。 std.Thread.spawn 启动一个新线程来计算结果。
此示例将数组分成两半,并在单独的线程中执行工作。
注意:为了确保当
t2启动失败时t1线程已完成,我们在启动t1后立即defer t1.join()。
const std = @import("std");
pub fn main() !void {
var arr = [_]i32{ 1, 25, -4, 10, 100, 200, -100, -200 };
var max_value: i32 = undefined;
try findMax(&max_value, &arr);
try std.testing.expectEqual(max_value, 200);
}
fn findMax(max_value: *i32, values: []i32) !void {
const THRESHOLD: usize = 2;
if (values.len <= THRESHOLD) {
var res = values[0];
for (values) |it| {
res = @max(res, it);
}
max_value.* = res;
return;
}
const mid = values.len / 2;
const left = values[0..mid];
const right = values[mid..];
var left_max: i32 = undefined;
var right_max: i32 = undefined;
// This block is necessary to ensure that all threads are joined before proceeding.
{
const t1 = try std.Thread.spawn(.{}, findMax, .{ &left_max, left });
defer t1.join();
const t2 = try std.Thread.spawn(.{}, findMax, .{ &right_max, right });
defer t2.join();
}
max_value.* = @max(left_max, right_max);
}