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", .{});
}