手动进行线程切换的问题
各位大虾,最近我在把一个多线程单核的嵌入式实时操作系统移植到WINDOWS XP上来(准确的说是用XP来模拟这么一个操作系统), 在进行线程调度的时候遇到了问题:因为WINDOWS的线程调度某种程度上都是自动的,所提供的API没办法去进行内核层面的调度,还请大家提供一种可靠的办法。现把代码贴出:
BOOL ThreadSwap(HANDLE oldTaskHandle, UINT32 newTaskHandle)
{
ResumeThread(newTaskHandle);
SuspendThread(oldTaskHandle);
}
问题来了,在运行到了ResumeThread时,newTask可能立即就得到了执行,导致SuspendThread还没法执行到。oldTask没法立即Suspend住,系统再运行一段时间后,各个Thread的状态就乱掉了。如果能保证ResumeThread和SuspendThread这两个操作的原子性,那么也是可以的。请教各位有什么好办法没?
当然,还有另外一种办法,把所有的虚拟线程都放在一个线程中跑,在Swap时,备份当前线程的上下文,再恢复新线程的上下文,之后再修改PC指针,这个办法也是可以的,但这样就没法查看各个虚拟线程的调用栈,不到万不得已不想用这种办法。