cannot pause

ポエニーを起動していると、1度だけスレッド例外で"cannot pause"というのが出たので、ちょっとstd.threadを見てみたのですが、


// class std.thread.Thread
void pause()
{
if (state != TS.RUNNING || SuspendThread(hdl) == 0xFFFFFFFF)
error("cannot pause");
}

static void pauseAll()
{
if (nthreads > 1)
{
Thread tthis = getThis();

for (int i = 0; i < allThreadsDim; i++)
{ Thread t;

t = allThreads[i];
if (t && t !is tthis && t.state == TS.RUNNING)
t.pause();
}
}
}


ワーカースレッドが起動したり、終了したりを繰り返している中で、GCのfullCollectがpauseAllを呼び出すことを考えると、t.state == TS.RUNNING〜t.pauseの呼び出しまでに、tが終了して、state == TS.TERMINATEDになるタイミングがあるんじゃないかと。
Windowsのスレッドがどういうタイミングでディスパッチするのか、よく知らないのですが、時分割しているならありえると思うんですよ。
ここのスレッド配列の操作と各スレッドの終了時にstateを変更している部分は、threadLockのクリティカルセクション内でやらないと、まずいですよね?