Commit bdd1a9e48c
Changed files (1)
lib
std
Thread
lib/std/Thread/Semaphore.zig
@@ -11,6 +11,8 @@ const Semaphore = @This();
const std = @import("../std.zig");
const Mutex = std.Thread.Mutex;
const Condition = std.Thread.Condition;
+const builtin = @import("builtin");
+const testing = std.testing;
pub fn wait(sem: *Semaphore) void {
sem.mutex.lock();
@@ -31,3 +33,29 @@ pub fn post(sem: *Semaphore) void {
sem.permits += 1;
sem.cond.signal();
}
+
+test "Thread.Semaphore" {
+ if (builtin.single_threaded) {
+ return error.SkipZigTest;
+ }
+
+ const TestContext = struct {
+ sem: *Semaphore,
+ n: *i32,
+ fn worker(ctx: *@This()) void {
+ ctx.sem.wait();
+ ctx.n.* += 1;
+ ctx.sem.post();
+ }
+ };
+ const num_threads = 3;
+ var sem = Semaphore{ .permits = 1 };
+ var threads: [num_threads]std.Thread = undefined;
+ var n: i32 = 0;
+ var ctx = TestContext{ .sem = &sem, .n = &n };
+
+ for (threads) |*t| t.* = try std.Thread.spawn(.{}, TestContext.worker, .{&ctx});
+ for (threads) |t| t.join();
+ sem.wait();
+ try testing.expect(n == num_threads);
+}