【问题标题】:pthread scheduling issue while using sleep使用睡眠时的 pthread 调度问题
【发布时间】:2016-10-26 05:40:45
【问题描述】:

我产生了四个可分离的线程,并且在每个线程中我给予 1 秒睡眠(睡眠是我的应用程序要求),因为操作系统只安排 2 个线程,其他两个线程处于理想状态,但如果我删除睡眠,所有线程都被安排按操作系统,但我的应用程序要求是每个线程在完成任务后都应该进入睡眠模式

我已经尝试过 sleep、nanosleep 并在 pthread 中设置线程属性、优先级和循环调度,但没有成功。

请建议我还能做些什么来解决我的应用程序问题。

【问题讨论】:

  • 你到底想做什么?如果您只想让线程等待暂停,直到它们有工作要做,请查看条件变量..
  • 您是否让线程在持有互斥锁或类似的东西时进入睡眠状态?休眠不会解锁互斥锁、操纵信号量、信号条件变量等。
  • 一个minimal reproducible example 会在这里。
  • @Dmitri,我的所有线程都需要连续发送一些状态,但是一旦一个线程发送状态,它应该等待一秒钟。
  • @JohnBollinger,我没有在我的线程中使用任何互斥体、信号量,因为我没有更新任何全局数据,只是发送一些状态

标签: c multithreading pthreads sleep scheduling


【解决方案1】:

现在我使用以下逻辑为每个线程提供一秒钟的时间间隔,并从我的代码中删除睡眠,问题得到解决(现在所有四个线程都已安排)。

(void) gettimeofday (&nowtime, NULL);
unsigned long long currentTime = (nowtime.tv_sec * 1000000) + nowtime.tv_usec;
unsigned long long FutureTime =  ((nowtime.tv_sec + interval) * 1000000) + nowtime.tv_usec;
while(FutureTime >= currentTime)
{
    (void) gettimeofday (&nowtime, NULL);
    currentTime = (nowtime.tv_sec * 1000000) + nowtime.tv_usec;
}

【讨论】:

  • 您确定这样的繁忙循环是个好主意吗?你的线程不会休眠......它只会消耗尽可能多的 CPU 周期,即使它应该只是等待。您没有使用您尝试过的其他方法的唯一原因是线程似乎没有被调度在等待期间?这可能不是一件坏事,只要在等待结束时安排好了。
  • 是的,它会使用 cpu 周期,但至少它对所有线程的调度并不理想,如果有更好的想法,请建议,因为我也在考虑 cpu 周期。
  • 为什么休眠线程需要在休眠时调度?将他们安排在等待之后,当他们可能真正需要做某事时,这还不够吗?如果您希望能够中断等待,您可以尝试对条件变量进行定时等待、对文件描述符进行定时等待,或者可能使用信号。或者至少,您可以在每次检查间隔并确定等待未完成时产生时间片。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多