Segmentation fualt on ubuntu linux when using Fiber
davesun
davesun at 126.com
Sun May 17 22:01:56 PDT 2009
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);
}
More information about the Digitalmars-d-bugs
mailing list