在计时器上的pthread之间切换

时间:2014-08-26 22:09:29

标签: c++ multithreading pthreads

我想使用单个处理器在c ++程序中制作两个pthread。 Thread1将无限运行,但需要每隔5微秒中断一次,以允许thread2在切换回thread1之前执行while循环的一次迭代。我知道如何制作pthreads等等,但我无法弄清楚如何根据计时器进行线程之间的切换。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

如果您不希望两个线程同时运行,那么您不应该使用两个线程。第二个线程可以用作每个5微秒从第一个线程调用的函数。

答案 1 :(得分:2)

您想要的问题是中断的时间间隔的比例。通常的操作系统不会经常切换线程,正常速率以毫秒为单位。要达到5微秒的间隔,你需要

  • 具有低成本高精度中断的实时操作系统或为同一目的编写自己的内核模块。
  • 主动安排线程。即或多或少类似于Samer所建议的。

我不熟悉RtOS或驱动程序。我怀疑你可能需要这个非常专业的解决方案。至于第二种方法..

的pthreads

你仍然可以使用pthreads但是确保thread1至少每5微秒调用一次OS,以便OS有机会将其重新安排到thread2。并且您需要为thread2分配更高的优先级或设置不同的调度策略,如Round-Robin而不是Fair Scheduling:see here

但是,这种线程方法将遭受上下文切换的巨大开销:假设roughly 1300 ns per context switch,并且每5微秒需要2个交换机,则导致<<> 50%的开销时间 !

协程

另一种方法可以是用户级线程(coroutines / fibers)调度。它具有明显更少的开销,并使thread2能够被编写为循环,它定期休眠而不是完全退出其功能。无论如何,它还需要thread1来处理检查点,其速率足以允许每5微秒进行一次切换。

功能

最后,如果thread2可以很容易地实现为具有状态的函数以便处理循环,那么从开销和复杂性观点来看,它是最佳选择。