digitalmars.D.bugs - Segmentation fualt on ubuntu linux when using Fiber
- davesun (83/83) May 17 2009 the following code use multi-threads to scheduler some fibers, segfaul...
the following code use multi-threads to scheduler some fibers, segfault occur sometime!Is there anything wrong with the fiber's implementation. private import core.thread; private import std.stdio; private class SyncQueue(T) { private T[] queue; public synchronized void push(T o) { queue ~= o; } public synchronized T pop() { T o = null; if(queue.length > 1){ o = queue[0]; queue = queue[1..$]; } else if (queue.length == 1) { o = queue[0]; queue = []; } return o; } } private class Scheduler { private SyncQueue!(Fiber) runQueue; public this () { runQueue = new SyncQueue!(Fiber); } public void addFiber(Fiber fiber) { runQueue.push(fiber); } public void run(int threadNum =1) { ThreadGroup tg = new ThreadGroup; for(int i =0;i<threadNum;i++){ tg.create({ while (true) { Fiber fiber = runQueue.pop(); if (fiber is null) { continue; } else { fiber.call(); if (fiber.state != Fiber.State.TERM) runQueue.push(fiber); } } }); } tg.joinAll; } } class WorkFiber:Fiber { this(){ super(&run); } void run() { while (true) { writefln("Thread:%p,Fiber:%p",cast(void*)Thread.getThis,cast (void*)Fiber.getThis); Fiber.yield(); } } } void main() { Scheduler p = new Scheduler; for(int i=0;i<30000;i++) p.addFiber(new WorkFiber); p.run(4); }
May 17 2009