需要在线程任务中正确使用sleep()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需要在线程任务中正确使用sleep()相关的知识,希望对你有一定的参考价值。

//周期性任务的线程在无限循环中运行。我已经包含了一个标志和sleep(),因此它只执行一段时间然后进入睡眠状态。但是,在修改之后,我根本没有得到输出“执行线程”。请建议,如何修改sleep函数的使用,以便我得到输出“执行线程”的时间,然后它进入睡眠状态.//

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>
int exitflag=0;

struct task_spec_struct 
{ 
    char task_type;
    int period,r_min,r_max;
}s1;

int gen_rand(int a, int b) 
{ 
    srand(time(NULL));
     int x = a+(rand()%(b-a));
      return x;
}

//task body to utilize CPU to perform computations

void* periodic_task(void* arg)
{
   struct task_spec_struct *arg_struct = (struct task_spec_struct*) arg;


  int rand_num = gen_rand(arg_struct->r_min, arg_struct->r_max);
  while(1)
    {
  int i, j=0;
  for(i=0; i<rand_num; i++)
  {
     j=j+i;

     }
     if (exitflag==1)
     {
     pthread_exit(0);
     }
  usleep((arg_struct->period)*1000);
  printf("Executing thread1");
  }

  //pthread_exit(0);
}


int main(int argc, char **argv)
{
  int num_args = argc-1;

// Creating pthread for periodic task ( runs Thread function to run periodically)
 // printf("
Give task with specifications:");
  s1.task_type= 'P';
  s1.period= 300;
  s1.r_min= 400;
  s1.r_max= 500;

    pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tid, &attr, periodic_task, &s1);
        int ret=sleep(3);

  if (ret==0)
   {
       exitflag=1;
   }
  pthread_join(&tid, NULL);


}
答案

默认情况下,printf不会刷新,除非您使用换行符结束字符串。见Why does printf not flush after the call unless a newline is in the format string?

您没有看到输出,因为没有刷新缓冲区。添加新行字符,或在stdout上调用fflush。

以上是关于需要在线程任务中正确使用sleep()的主要内容,如果未能解决你的问题,请参考以下文章

Sleep() 方法后的代码片段没有被执行

异步任务片段背景数据

如何在 C 中正确使用“sleep()”系统调用

sleep函数作用(转)

在没有 time.sleep 的代码中添加时间延迟(代码包含线程)

Erlang timer:sleep(1000) 导致线程死机