@@ -23,7 +23,7 @@ pub fn main() !void {
2323 // const t5 = try std.Thread.spawn(.{}, testDataChan, .{});
2424 // t5.join();
2525
26- const t6 = try std .Thread .spawn (.{}, testPreemption , .{});
26+ const t6 = try std .Thread .spawn (.{}, testTimerLifecycle , .{});
2727 t6 .join ();
2828}
2929
@@ -300,4 +300,81 @@ pub fn testPreemption() !void {
300300 }.run , .{});
301301}
302302
303+ pub fn testTimerLifecycle () ! void {
304+ _ = try zco .loop (struct {
305+ fn run () ! void {
306+ const s = try zco .getSchedule ();
307+
308+ // 协程1:长时间运行,不主动让出CPU,测试是否会被定时器中断
309+ var counter1 : usize = 0 ;
310+ _ = try s .go (struct {
311+ fn run (counter : * usize ) ! void {
312+ std .log .info ("协程1开始运行(长时间计算,不主动让出CPU)" , .{});
313+ while (counter .* < 10000000 ) : (counter .* += 1 ) {
314+ // 简单的整数运算,不调用任何可能让出CPU的函数
315+ _ = counter .* * 2 ;
316+
317+ // 每100000次输出一次进度,观察是否被中断
318+ if (counter .* % 100000 == 0 ) {
319+ std .log .info ("协程1进度: {}" , .{counter .* });
320+ }
321+ }
322+ std .log .info ("协程1完成,计数: {}" , .{counter .* });
323+ }
324+ }.run , .{& counter1 });
325+
326+ // 协程2:另一个长时间运行的计算,不主动让出CPU
327+ var counter2 : usize = 0 ;
328+ _ = try s .go (struct {
329+ fn run (counter : * usize ) ! void {
330+ std .log .info ("协程2开始运行(长时间计算,不主动让出CPU)" , .{});
331+ while (counter .* < 10000000 ) : (counter .* += 1 ) {
332+ // 简单的整数运算,不调用任何可能让出CPU的函数
333+ _ = counter .* * 3 ;
334+
335+ // 每100000次输出一次进度,观察是否被中断
336+ if (counter .* % 100000 == 0 ) {
337+ std .log .info ("协程2进度: {}" , .{counter .* });
338+ }
339+ }
340+ std .log .info ("协程2完成,计数: {}" , .{counter .* });
341+ }
342+ }.run , .{& counter2 });
343+
344+ // 协程3:短时间运行,用于观察调度效果
345+ _ = try s .go (struct {
346+ fn run () ! void {
347+ const schedule = try zco .getSchedule ();
348+ const co = try schedule .getCurrentCo ();
349+ std .log .info ("协程3开始运行(短时间,会主动让出CPU)" , .{});
350+
351+ for (0.. 10) | i | {
352+ std .log .info ("协程3: 步骤 {}" , .{i });
353+ try co .Suspend (); // 主动挂起
354+ try co .Sleep (50 * std .time .ns_per_ms ); // 睡眠50ms
355+ }
356+
357+ std .log .info ("协程3完成" , .{});
358+ }
359+ }.run , .{});
360+
361+ std .log .info ("开始运行调度器,测试时间片抢占..." , .{});
362+ std .log .info ("如果时间片抢占正常工作,应该看到协程1和协程2交替输出进度" , .{});
363+
364+ // 主协程等待一段时间
365+ const mainCo = try s .getCurrentCo ();
366+ try mainCo .Sleep (5 * std .time .ns_per_s );
367+
368+ std .log .info ("测试完成!" , .{});
369+ std .log .info ("协程1最终计数: {}" , .{counter1 });
370+ std .log .info ("协程2最终计数: {}" , .{counter2 });
371+
372+ // 输出性能统计
373+ s .printStats ();
374+
375+ s .stop ();
376+ }
377+ }.run , .{});
378+ }
379+
303380test "simple test" {}
0 commit comments