linux运行多线程

/* https://www.cnblogs.com/luoxn28/p/6087649.html 
 * https://www.cnblogs.com/xiaotlili/p/3510224.html                                                                
 * POSIX Real Time Example
 * using a single pthread as RT thread
 */
/*gcc -o rt_example rt_example.c -lpthread -lrt -Wall
  sudo ./rt_example */
/*
 *其实,普通进程的调度,是CPU根据进程优先级算出时间片,这样并不能一定保证高优先级的进程一定先运行,
 *只不过和优先级低的进程相比,通常优先级较高的进程获得的CPU时间片会更长而已。其实,如果要想保证一
 *个线程运行完在运行另一个线程的话,就要使用多线程的同步技术,信号量,条件变量等方法。而不是绝对依
 *靠优先级的高低,来保证。
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

#include <sched.h>
#include <limits.h>
#include <sys/mman.h>

pthread_attr_t attr,attr1,attr2;
pthread_t ppid1,ppid2,ppid3;

void Thread1()
{
  //sleep(1);
  int i,j;
  int policy;
  struct sched_param param;

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

  pthread_getschedparam(pthread_self(),&policy,&param);
  if(policy == SCHED_OTHER)
    printf("SCHED_OTHER\n");

  if(policy == SCHED_RR)
    printf("SCHED_RR 1 \n");

  if(policy==SCHED_FIFO)
    printf("SCHED_FIFO\n");

  /*for(i=1;i<10;i++)
  {
    for(j=1;j<5000000;j++)
    {
    }
    printf("thread 1\n");
  }
  printf("Pthread 1 exit\n");*/
  
  while(1) {
      usleep(1*10);//为防止这个无限循环占用100%CPU,从而使linux内核无法调度进程/线程,这里必须加上这个usleep(),以免linux死掉
      pthread_testcancel();
  }
}

void Thread2()
{
  //sleep(1);
  int i,j;
  int policy;
  struct sched_param param;

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
  
  pthread_getschedparam(pthread_self(),&policy,&param);
  if(policy == SCHED_OTHER)
    printf("SCHED_OTHER\n");

  if(policy == SCHED_RR)
    printf("SCHED_RR\n");

  if(policy==SCHED_FIFO)
    printf("SCHED_FIFO\n");

  /*for(i=1;i<10;i++)
  {
    for(j=1;j<5000000;j++)
    {
     
    }
    printf("thread 2\n");
  }
  printf("Pthread 2 exit\n");*/
  
  while(1) {
     usleep(1*10);//为防止这个无限循环占用100%CPU,从而使linux内核无法调度进程/线程,这里必须加上这个usleep(),以免linux死掉
     pthread_testcancel();
  }
}

void Thread3()
{
  //sleep(1);
  int i,j;
  int policy;
  struct sched_param param;

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
  
  pthread_getschedparam(pthread_self(),&policy,&param);
  if(policy == SCHED_OTHER)
    printf("SCHED_OTHER\n");

  if(policy == SCHED_RR)
    printf("SCHED_RR \n");

  if(policy==SCHED_FIFO)
    printf("SCHED_FIFO\n");

  /*for(i=1;i<10;i++)
  {
    for(j=1;j<5000000;j++)
    {
    }
    printf("thread 3\n");
  }
  printf("Pthread 3 exit\n");*/
  
  while(1) {
    usleep(1*10);//为防止这个无限循环占用100%CPU,从而使linux内核无法调度进程/线程,这里必须加上这个usleep(),以免linux死掉
    pthread_testcancel();
  }
}

int create_rt_thread3(void)
{
  int ret=0;

  ret=pthread_attr_init(&attr);
  if(ret){
     printf("init pthread3 attributes failed\n");
     goto out;
  }

  /*Set a specific stack size*/
  ret=pthread_attr_setstacksize(&attr,PTHREAD_STACK_MIN);
  if(ret){
     printf("pthread3 setstacksize failed\n");
     goto out;
  }

  ret=pthread_create(&ppid3,&attr,(void *)Thread3,NULL);
  if(ret){
     printf("create pthread3 failed\n");
     goto out;
  }

out:
  return ret;
}

int create_rt_thread1(void)
{
  int ret=0;
  struct sched_param param;

  ret=pthread_attr_init(&attr1);
  if(ret){
     printf("init pthread attributes failed\n");
     goto out;
  }  

  /*Set a specific stack size*/
  ret=pthread_attr_setstacksize(&attr1,PTHREAD_STACK_MIN);
  if(ret){
     printf("pthread setstacksize failed\n");
     goto out;
  }

  //param.sched_priority = 21;
  ret=pthread_attr_setschedpolicy(&attr1,SCHED_RR);
  if(ret){
     printf("pthread setschedpolicy failed\n");
     goto out;
  }

  param.sched_priority = 21;
  ret=pthread_attr_setschedparam(&attr1,&param);
  if(ret){
     printf("pthread setschedparam failed\n");
     goto out;
  }

  ret=pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);//要使优先级其作用必须要有这句话
  if(ret){
     printf("pthread setinheritsched failed\n");
     goto out;
  }

  ret=pthread_create(&ppid1,&attr1,(void *)Thread1,NULL);
  if(ret){
     printf("create pthread failed\n");
     goto out;
  }

out:
  return ret;
}

int create_rt_thread2(void)
{
  int ret=0;
  struct sched_param param;

  ret=pthread_attr_init(&attr2);
  if(ret){
     printf("init pthread attributes failed\n");
     goto out;
  }

  /*Set a specific stack size*/
  ret=pthread_attr_setstacksize(&attr2,PTHREAD_STACK_MIN);
  if(ret){
     printf("pthread setstacksize failed\n");
     goto out;
  }

  //param.sched_priority = 51;
  ret=pthread_attr_setschedpolicy(&attr2,SCHED_RR);
  if(ret){
     printf("pthread setschedpolicy failed\n");
     goto out;
  }

  param.sched_priority = 51;
  ret=pthread_attr_setschedparam(&attr2,&param);
  if(ret){
     printf("pthread setschedparam failed\n");
     goto out;
  }

  ret=pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);
  if(ret){
     printf("pthread setinheritsched failed\n");
     goto out;
  }

  ret=pthread_create(&ppid2,&attr2,(void *)Thread2,NULL);
  if(ret){
     printf("create pthread failed\n");
     goto out;
  }

out:
  return ret;
}

int main()
{
  int i,ret=0;
  void* retval;
  
  /* Lock memory */
   if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
      printf("mlockall failed: %m\n");
      exit(-2);
   }

  i = getuid();
  if(i==0)
    printf("The current user is root\n");
  else
    printf("The current user is not root\n");

  create_rt_thread1();
  create_rt_thread2();
  create_rt_thread3();
 
  /*pthread_join(ppid3,NULL);
  pthread_join(ppid2,NULL);
  pthread_join(ppid1,NULL);*/
  
  /* Join the thread and wait until it is done */
  ret = pthread_join(ppid1,&retval);
  if (ret)
     printf("join pthread failed: %m\n");

  printf("thread1 retval is %d\n",(int*)retval);

  ret = pthread_join(ppid2,&retval);
  if (ret)
     printf("join pthread failed: %m\n");

  printf("thread2 retval is %d\n",(int*)retval);

  ret = pthread_join(ppid3,&retval);
  if (ret)
     printf("join pthread failed: %m\n");

  printf("thread3 retval is %d\n",(int*)retval);

  pthread_attr_destroy(&attr);
  pthread_attr_destroy(&attr1);
  pthread_attr_destroy(&attr2);

  return ret;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值