/* 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,¶m);
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,¶m);
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,¶m);
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,¶m);
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,¶m);
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;
}