57 lines
1.4 KiB
Zig
57 lines
1.4 KiB
Zig
const std = @import("std");
|
|
const Thread = std.Thread;
|
|
const info = std.log.info;
|
|
const Queue = std.atomic.Queue;
|
|
|
|
const Task = struct {
|
|
row_idx: usize,
|
|
row_pixels: []u8,
|
|
};
|
|
|
|
fn worker(q: *Queue(Task)) void {
|
|
while (true) {
|
|
if (q.get()) |node| {
|
|
const task = node.data;
|
|
info("starting thread: {}", .{task.row_idx});
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn main() anyerror!void {
|
|
const allocator = std.heap.page_allocator;
|
|
const cpus = try Thread.getCpuCount();
|
|
const width = 512;
|
|
const height = 256;
|
|
var pixels: [width * height * 3]u8 = undefined;
|
|
|
|
var threads: std.ArrayList(std.Thread) = std.ArrayList(std.Thread).init(allocator);
|
|
var q = Queue(Task).init();
|
|
const Node = Queue(Task).Node;
|
|
var row: usize = 0;
|
|
while (row < height) : (row += 1) {
|
|
const node = try allocator.create(Node);
|
|
node.* = .{
|
|
.prev = undefined,
|
|
.next = undefined,
|
|
.data = Task{
|
|
.row_idx = row,
|
|
.row_pixels = pixels[row * width * 3 .. (row + 1) * width * 3],
|
|
},
|
|
};
|
|
q.put(node);
|
|
}
|
|
|
|
var t: usize = 0;
|
|
while (t < cpus) : (t += 1) {
|
|
try threads.append(try Thread.spawn(.{}, worker, .{&q}));
|
|
}
|
|
|
|
// Wait for all threads to finish.
|
|
for (threads.items) |thread| {
|
|
Thread.join(thread);
|
|
}
|
|
info("main done", .{});
|
|
}
|