一、思维导图
二、练习题1
有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m 要求模拟这两列火车通过隧道的场景。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t m;
void Gao()
{
sleep(1);
pthread_mutex_lock(&m);
printf("高铁通过隧道1000m/100m's=10s\n");
pthread_mutex_unlock(&m);
}
void Kuai()
{
pthread_mutex_lock(&m);
printf("快车通过隧道1000m/50m's=20s\n");
pthread_mutex_unlock(&m);
}
void* Train(void* arg)
{
Kuai();
}
int main()
{
pthread_mutex_init(&m, NULL);
pthread_t id;
pthread_create(&id, 0, Train, 0);
pthread_detach(id);
Gao();
return 0;
}
二、练习题2
有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m,有一辆慢车每秒25m 要求模拟这两列火车通过隧道的场景,但是要求高铁最先过隧道,快车其次,慢车最后。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t g;
pthread_mutex_t k;
pthread_mutex_t m;
void task_main()
{
while(1)
{
pthread_mutex_lock(&g);
printf("高铁通过隧道\n");
sleep(1);
pthread_mutex_unlock(&k);
}
}
void task1()
{
while(1)
{
pthread_mutex_lock(&k);
printf("快车通过隧道\n");
sleep(1);
pthread_mutex_unlock(&m);
}
}
void task2()
{
while(1)
{
pthread_mutex_lock(&m);
printf("慢车通过隧道\n");
sleep(1);
pthread_mutex_unlock(&g);
}
}
void* thread_main1(void* arg)
{
task1();
}
void* thread_main2(void* arg)
{
task2();
}
int main()
{
pthread_mutex_init(&g, NULL);
pthread_mutex_init(&k, NULL);
pthread_mutex_init(&m, NULL);
pthread_mutex_lock(&k);
pthread_mutex_lock(&m);
pthread_t id;
pthread_create(&id, 0, thread_main1, 0);
pthread_detach(id);
pthread_t id2;
pthread_create(&id2, 0, thread_main2, 0);
pthread_detach(id2);
task_main();
return 0;
}
三、练习题3
使用条件变量实现一个生产者消费者模型(pv)模型
生产者线程:每秒生成2个苹果
消费者线程:每3秒消费 5~9个苹果
要求:消费者在消费之前一定要有足够的苹果给消费。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
int apple = 0;
int buy_apple = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void producer_task() //生产者
{
while(1){
pthread_mutex_lock(&mutex);
apple += 2;
printf("当前苹果库存:%d\n", apple);
if(apple >= buy_apple){
printf("唤醒消费者\n");
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void consumer_task() //消费者
{
while(1){
pthread_mutex_lock(&mutex);
//确定本次消费数量
buy_apple = rand() % 5 + 5;
printf("本次要消费%d个苹果\n", buy_apple);
//为了保证每次apple>=buy_apple所以消费者需要等待,生产者通知消费者苹果数量足够消费
pthread_cond_wait(&cond, &mutex);
apple -= buy_apple;
printf("当前剩余苹果数量为:%d\n", apple);
pthread_mutex_unlock(&mutex);
sleep(3);
}
}
void* thread_main(void* arg)
{
consumer_task();
}
int main()
{
srand(time(0));
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_t id;
pthread_create(&id, NULL, thread_main, NULL);
pthread_detach(id);
producer_task();
return 0;
}