linux设置调度策略和更改优先级

#include "myhead.h"

/*
	条件变量配合互斥锁实现完整的卖票功能
	完整的卖票功能:
	    票卖完了要阻塞
		放出新的票要重新开始卖(解除阻塞)
*/

//定义全局变量,表示当前的车票的总数量
volatile int num=20;
//定义互斥锁变量
pthread_mutex_t mymutex;

//定义条件变量
pthread_cond_t mycond;

//第一个窗口
void *win1(void *arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mymutex);
		if(num<=0) //票卖完了,应该阻塞当前线程
		{
			printf("窗口1被条件变量给阻塞了!\n");
			pthread_cond_wait(&mycond,&mymutex);
		}
		num--;		
		printf("窗口1卖出一张票,目前剩余票的数量是: %d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		usleep(5000); //防止自己解锁以后,自己无耻把锁上了
	}
}
//第二个窗口
void *win2(void *arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mymutex);
		if(num<=0) //票卖完了,应该阻塞当前线程
		{
			printf("窗口2被条件变量给阻塞了!\n");
			pthread_cond_wait(&mycond,&mymutex);
		}	
		num--;
		printf("窗口2卖出一张票,目前剩余票的数量是: %d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		usleep(5000); //防止自己解锁以后,自己无耻把锁上了
	}
}
//第三个窗口
void *win3(void *arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mymutex);
		if(num<=0) //票卖完了,应该阻塞当前线程
		{
			printf("窗口3被条件变量给阻塞了!\n");
			pthread_cond_wait(&mycond,&mymutex);
		}	
		num--;
		printf("窗口3卖出一张票,目前剩余票的数量是: %d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		usleep(5000); //防止自己解锁以后,自己无耻把锁上了
	}
}
//第四个窗口
void *win4(void *arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mymutex);
		if(num<=0) //票卖完了,应该阻塞当前线程
		{
			printf("窗口4被条件变量给阻塞了!\n");
			pthread_cond_wait(&mycond,&mymutex);
		}	
		num--;
		printf("窗口4卖出一张票,目前剩余票的数量是: %d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		usleep(5000); //防止自己解锁以后,自己无耻把锁上了
	}
}
//第五个窗口
void *win5(void *arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mymutex);
		if(num<=0) //票卖完了,应该阻塞当前线程
		{
			printf("窗口5被条件变量给阻塞了!\n");
			pthread_cond_wait(&mycond,&mymutex);
		}	
		num--;
		printf("窗口5卖出一张票,目前剩余票的数量是: %d\n",num);
		sleep(1);
		pthread_mutex_unlock(&mymutex);
		usleep(5000); //防止自己解锁以后,自己无耻把锁上了
	}
}


int main()
{
	pthread_t id1,id2,id3,id4,id5;
	pthread_attr_t  myattr;
	struct sched_param myparam1;
	//初始化互斥锁
	pthread_mutex_init(&mymutex,NULL);

	//初始化条件变量
	pthread_cond_init(&mycond,NULL);
	//线程属性的初始化
	pthread_attr_init(&myattr);
	//不继承创作者的调度策略才能更改调度策略
	pthread_attr_setinheritsched(&myattr, PTHREAD_EXPLICIT_SCHED);
	//设置调度策略
	pthread_attr_setschedpolicy(&myattr, SCHED_RR);
	//设置优先级
	myparam1.sched_priority = 99;
	//使能
	pthread_attr_setschedparam(&myattr, &myparam1);


	//创建5个线程,分别五个售票窗口
	pthread_create(&id1,NULL,win1,NULL);
	pthread_create(&id2,NULL,win2,NULL);
	pthread_create(&id3,NULL,win3,NULL);
	pthread_create(&id4,NULL,win4,NULL);
	//赋予属性值
	pthread_create(&id5,&myattr,win5,NULL);
	
	//主函数充当铁道部领导
	while(1)
	{
		if(num<=0)
		{
			printf("铁道部领导,之前的票卖完了,请您在批一批新的票!\n");
			scanf("%d",&num);
			//立马唤醒其中一个线程--》具体唤醒哪一个线程取决于cpu调度
			//pthread_cond_signal(&mycond);  
			//立马唤醒所有的线程
			pthread_cond_broadcast(&mycond);  
		}
	}
	//回收线程
	pthread_join(id1,NULL);
	pthread_join(id2,NULL);
	pthread_join(id3,NULL);
	pthread_join(id4,NULL);
	pthread_join(id5,NULL);
	//摧毁属性值
	pthread_attr_destroy(&myattr);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,进程的调度策略和实时优先级可以通过调整相关参数进行设定。 进程的调度策略调度类别和调度策略两部分组成。调度类别包括实时进程和普通进程,而调度策略包括FIFO(先进先出)、RR(轮转)、以及其他一些非实时调度策略。 对于实时进程,可以通过设置调度策略和实时优先级,来决定进程的调度次序。调度策略包括SCHED_FIFO(先进先出)和SCHED_RR(轮转)两种。SCHED_FIFO策略下,实时进程的执行顺序按照进入等待队列的先后顺序,优先级越高的进程越先执行;而SCHED_RR策略下,实时进程以时间片为单位进行轮转调度,每个进程执行一个时间片后切换到下一个进程。实时进程的实时优先级范围为1-99,优先级越高的进程被调度的机会越多。 对于普通进程,可以选择使用其他非实时调度策略,如SCHED_NORMAL(普通进程默认调度策略)等。除了实时优先级外,普通进程还有一个静态优先级,范围从0-39,静态优先级越高的进程在竞争CPU资源时被CPU调度程序考虑的机会越多。 在Linux系统中,可以使用相关命令和API函数来设定进程的调度策略和实时优先级。例如,通过使用命令"chrt"可以更改进程的调度策略和实时优先级,而在编程时可以使用调度相关的函数如sched_setscheduler()和sched_setparam()来进行设定。 通过合理设置进程的调度策略和实时优先级,可以优化系统的性能,使得实时任务能够按照预定的要求运行。但需要注意的是,过高的实时优先级可能会导致系统其他进程被饿死,因此需要在设定时进行权衡和限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值