#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;
}
linux设置调度策略和更改优先级
最新推荐文章于 2024-04-24 15:58:22 发布