定期调用创建的线程的函数(手动调度)

时间:2014-11-13 08:14:07

标签: c linux multithreading pthreads

我创建了10个线程(准确地说是pthreads),每个线程都注册了一个回调函数,例如fn1,fn2 ... fn10。我还使用调度策略FIFO为每个线程分配不同的优先级。应用程序的要求是必须定期调用这些函数中的每一个(周期性因每个线程而异)。为了实现周期性,我从其他问题中获得了使用itimer和sigwait方法的想法(不太确定这是否是实现此方法的好方法,欢迎任何其他实现此建议)。

我的问题是,当每个线程的周期变化时,我如何处理SIGALRM在各自的线程中重复调用这些函数?

提前致谢。

1 个答案:

答案 0 :(得分:2)

使用Do sleep functions sleep all threads or just the one who call it?作为参考,我的建议是避免使用SIGALRM。信号通常会传递给流程。

恕我直言,你有两种方法可以做到这一点:

  • 实现一个知道所有线程周期性的聪明的监视器。它计算它必须唤醒线程的时间,睡眠到那个时间,唤醒线程并继续迭代它。 Pro:线程只等待信号量或其他互斥量,con:监视器对我来说太聪明了
  • 每个线程都知道它的周期性,并存储它的最后开始时间。当它完成它的工作时,它计算它应该等到下一个激活时间并在该持续时间内休眠的时间。 Pro:每个线程完全独​​立,实现看起来很简单,缺点:你必须确保在你的实现中,sleep只调用阻塞调用线程。

我会使用第二种解决方案,因为第一种解决方案在线程环境中看起来像sleep的用户级实现。