优雅地(即最终合作地)暂停线程执行

时间:2011-02-10 13:41:40

标签: c multithreading thread-safety pthreads

我必须开发一个试图模拟嵌入式目标的执行流程的应用程序。该目标有2个优先级:最高优先级优先于最低优先级。使用循环调度程序管理低优先级,循环调度程序依次为每个线程提供1ms的执行时间。

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

我现在暂停线程通常是不安全的,这解释了为什么我没有找到任何“暂停(pid)”功能。

我基本上想象两个问题的解决方案:
- 找到一种在高优先级线程启动时挂起低优先级线程的方法(并在没有更高优先级活动时恢复它们)
- 在我的低优先级代码中到处调用一个非常小的“suspend_if_necessary”函数,并且每当必须启动高优先级时,等待所有低优先级进程调用该函数并暂停,作为单个高优先级线程执行,然后恢复他们都是。

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

如果能够轻松解决该问题,我会非常高兴,因为我真的需要代表目标执行流程的行为...

提前致谢,

勾漏。

2 个答案:

答案 0 :(得分:1)

不幸的是,用真正的线程实现你想要的东西真的不可能 - 即使重新启动高prio线程,也可能需要很长时间才能将高prio线程重新安排回来并暂停所有低优先级线程。而且,没有可靠的方法来确定是否仅使用POSIX线程阻止高优先级线程;你可以尝试手动跟踪事物,但这会产生两种误报(线程被阻塞在某些东西上,但是低prio线程认为它正在运行并暂停自身)和漏报(你错过了一个恢复的注释,或者它之间存在滞后)的风险线程实际上已恢复,当它标记为自己运行时。

如果要使用纯POSIX实现线程优先级系统,一个选项是使用线程,而是使用setcontext进行协作式多任务处理。这将允许您在用户级别的线程之间进行交换。但是,在这种情况下,您必须显式地生成CPU。它也无法阻止系统调用,这会阻止你的应用程序中的所有线程;但是既然你正在编写模拟器,这可能不是问题。

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

答案 1 :(得分:0)

暂停一个帖子,你就睡觉了。如果您希望能够在命令中唤醒它,请使用sigwait将其休眠,这会使线程进入睡眠状态,直到获得信号为止。您可以使用pthread_kill(疯狂的名称,但它实际上只是向线程发送信号)向特定线程发送信号。这是一种非常快速的睡眠和唤醒线程的方法。比条件变量快40倍,非常容易。