答案 0 :(得分:5)
如果您需要自己安排,那么您可以考虑使用fibers而不是线程。光纤类似于线程,因为它们是可执行代码的单独块,但是光纤可以在用户代码中调度,而线程仅由OS调度。单个线程可以托管和管理多个光纤的调度,光纤甚至可以相互安排。
答案 1 :(得分:1)
首先,您为线程使用了哪些优先级值?
如果将高优先级线程设置为THREAD_PRIORITY_TIME_CRITICAL
,它应该立即运行 - 只有与实时进程关联的线程才会具有更高的优先级。
其次,你怎么知道暂停和恢复没有立即发生?你确定这是问题吗?
您不能强制线程在外部等待某些内容而不挂起线程来注入等待代码;如果SuspendThread
不适合您,那么这无济于事。
最接近信号的可能是QueueUserAPC
,它将安排回调在下次线程进入“可警告的等待状态”时运行,例如,致电SleepEx
或WaitForSingleObjectEx
或类似。
答案 2 :(得分:1)
答案 3 :(得分:1)
[编辑] - 比下面的黑客更简单 - 似乎只是确保在同一CPU核心上运行的所有线程也解决了问题:o)毕竟。唯一的问题是CPU运行率接近100%,我不确定热量是否会对它造成损害。 [/编辑]
AHAA!我想我有一个解决方案 - 但它很难看。丑陋虽然保留在端口层。
我现在所做的是在每次创建线程时存储线程ID以运行任务(为每个创建的实时任务创建Win32线程)。然后我添加了下面的函数 - 使用跟踪宏调用。可以将跟踪宏定义为执行您想要的任何操作,并且已经证明在这种情况下非常有用。以下代码中的注释说明。模拟并不完美,所有这一切都是正确的线程调度,当它已经偏离实时调度时,我宁愿它不会出错,但是跟踪宏的定位使代码包含这个解决方案通过了所有测试:
void vPortCheckCorrectThreadIsRunning( void )
{
xThreadState *pxThreadState;
/* When switching threads, Windows does not always seem to run the selected
thread immediately. This function can be called to check if the thread
that is currently running is the thread that is responsible for executing
the task selected by the real time scheduler. The demo project for the Win32
port calls this function from the trace macros which are seeded throughout
the real time kernel code at points where something significant occurs.
Adding this functionality allows all the standard tests to pass, but users
should still be aware that extra calls to this function could be required
if their application requires absolute fixes and predictable sequencing (as
the port tests do). This is still a simulation - not the real thing! */
if( xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED )
{
/* Obtain the real time task to Win32 mapping state information. */
pxThreadState = ( xThreadState * ) *( ( unsigned long * ) pxCurrentTCB );
if( GetCurrentThreadId() != pxThreadState->ulThreadId )
{
SwitchToThread();
}
}
}