2011-02-10 75 views
1

我必须开发一个试图模拟嵌入式目标的执行流程的应用程序。这个目标有两个优先级:最高优先级最低优先级。低优先级由循环调度程序管理,循环调度程序依次为每个线程提供1ms的执行时间。优雅地(即最终合作)暂停线程执行

我的目标是编写一个库,它提供我的目标上可用的thread_create,thread_start和所有系统调用,并使用POSIX函数在本地在标准PC上重现行为。
因此,当一个高优先级的线程执行时,低优先级的线程应该被挂起,无论他们在那个时刻正在做什么。低优先级线程实施的责任是确保它不会受到干扰。

我现在暂停一个线程通常是不安全的,这就解释了为什么我没有找到任何“挂起(pid)”函数。

我基本上假设有两个解决问题的方案:
- 查找的方式暂停低优先级的线程时,高优先级的线程启动(并恢复他们的时候没有更多的高优先活动)
-periodically调用非常小的“suspend_if_necessary”函数在我的低优先级代码中无处不在,每当必须启动高优先级时,请等待所有低优先级进程调用该函数并暂停,作为单个高优先级线程执行,然后全部恢复。

即使它不是很干净,我很喜欢第二种解决方案,但仍然有一个问题:如何在不改变所有代码的情况下在任何地方调用该函数? 我不知道是否有一个简单的方法来做到这一点,有点像调试代码所做的那样:在执行的每一行添加一个钩子调用,检查标志并在标志更改时运行某些特定代码?

,我会非常高兴,如果有一个简单的解决这个问题,因为我真正需要的是代表与目标的执行流程的行为......

由于提前,

岣嵝。

+0

顺便说一下,高级prio线程只能由3个源启动:由低级prio线程,外部中断或睡眠后启动。所有这些源都驻留在我的库中,所以我“知道”它并可以立即将任何消息发送到其他线程。 – Goulou 2011-02-10 15:41:38

回答

1

不幸的是,用真正的线程实现你想要的东西是不太可能的 - 即使高级prio线程重新启动,在高级prio线程重新调入并暂停所有低优先级之前可能需要很长时间线程。此外,没有可靠的方法来确定高优先级线程是否被阻塞或者不使用POSIX线程;你可以尝试手动跟踪,但是这会带来误报的风险(线程被阻塞,但是低级别的线程认为它正在运行并暂停)和错误的否定(你错过了一个重新开始的注释,或者在该线程实际上已恢复运行,并将其标记为正在运行)。

如果要实现与POSIX纯线程优先级系统,一种选择是使用线程,而是使用setcontext的合作多任务。这将允许您在用户级别的线程之间进行交换。但是,在这种情况下,您必须明确地让出CPU。它也没有帮助阻止系统调用,它会阻止你的应用中的所有线程;但是由于您正在编写模拟器,因此这可能不是问题。

可能也能够在信号处理程序中使用setcontext交换线程;我没有亲自测试过这个案例,但是可能值得在SIGALRM处理程序中使用setcontext进行尝试调度。

+0

关于你的第一点:在我的想法中,高优先级线程将等待一个锁(信号量),直到所有其他活动线程(我可以计数它们)实际挂起。唯一缺少的是让所有其他线程调用这个“suspend_if_necessary”函数。 另一方面,高级和低级prio线程只能阻塞在我的库(事件,管道读取...)内的东西,所以这就是我认为是内部控制的(我现在是哪个线程处于活动状态,暂停了。 ..) – Goulou 2011-02-10 15:47:10

0

要挂起一个线程,你要睡觉。如果你想能够通过命令唤醒它,使用sigwait来休眠它,这会使线程进入休眠状态,直到它获得信号。你可以发送一个特定的线程信号pthread_kill(疯狂的名字,但它实际上只是发送信号到一个线程)。这是一个非常快速的睡眠和唤醒线程。比条件变量快40倍,非常容易。