互斥与同步
1:思维导图
2:有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m 要求模拟这两列火车通过隧道的场景
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
pthread_mutex_t m;
pthread_cond_t cond;
int a=0;
void *quit(void *arg)
{
pthread_mutex_lock(&m);
pthread_cond_wait(&cond,&m);
for(int i=0;i<=1000;i+=50)
{
printf("快车行驶%d米\n",i);
}
printf("快车出隧道\n");
pthread_mutex_unlock(&m);
}
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
printf("高铁进隧道\n");
for(int i=0;i<=1000;i+=100)
{
printf("高铁行驶%d米\n",i);
}
printf("高铁出隧道\n");
printf("快车准备进入\n");
pthread_mutex_init(&m,NULL);
pthread_cond_init(&cond,NULL);
pthread_t id;
pthread_create(&id,0,quit,0);
usleep(100);
pthread_detach(id);
pthread_cond_signal(&cond);
usleep(100);
return 0;
}
运行截图:
3:有一个隧道,长1000m,有一辆高铁,每秒100米,有一辆快车,每秒50m,有一辆慢车每秒25m 要求模拟这两列火车通过隧道的场景,但是要求高铁最先过隧道,快车其次,慢车最后
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
pthread_mutex_t m1;
pthread_mutex_t m2;
pthread_mutex_t m3;
void* task1(void * arg)
{
pthread_mutex_lock(&m1);
printf("高铁进入隧道\n");
printf("高铁出隧道\n");
pthread_mutex_unlock(&m2);
}
void* task2(void *arg)
{
pthread_mutex_lock(&m2);
printf("快车进入隧道\n");
printf("快车出隧道\n");
pthread_mutex_unlock(&m3);
}
void* task3(void *arg)
{
pthread_mutex_lock(&m3);
printf("慢车进入隧道\n");
printf("慢车出隧道\n");
pthread_mutex_unlock(&m1);
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&m1,NULL);
pthread_mutex_init(&m2,NULL);
pthread_mutex_lock(&m2);
pthread_mutex_init(&m3,NULL);
pthread_mutex_lock(&m3);
pthread_t id1,id2,id3;
pthread_create(&id1,0,task1,0);
pthread_create(&id2,0,task2,0);
pthread_create(&id3,0,task3,0);
pthread_detach(id1);
pthread_detach(id2);
pthread_detach(id3);
usleep(1000);
return 0;
}
运行截图:
4:使用条件变量实现一个生产者消费者模型(pv)模型 生产者线程:每秒生成2个苹果 消费者线程:没3秒消费 5~9个苹果 要求消费者在消费之前一定要有足够的苹果给消费
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include<time.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int a=0;//苹果数
int b=0;//每次消费数量
pthread_mutex_t m;//互斥锁
pthread_cond_t cond1;//条件变量
void *create(void *arg)//生成苹果
{
while(1)
{
pthread_mutex_lock(&m);
pthread_cond_wait(&cond1,&m);//唤醒
a=a+6;//苹果数增加
pthread_mutex_unlock(&m);
}
}
int main(int argc, const char *argv[])
{
pthread_t id1;
pthread_create(&id1,0,create,0);
pthread_detach(id1);
while(1)
{
srand((unsigned)time(NULL));
b=5+rand()%5;//取5-9的随机数
sleep(3);//休眠三秒
pthread_cond_signal(&cond1);//符合条件
usleep(1000);//让create成功执行
if(a>=b)
{
a=a-b;//苹果的剩余量
printf("消费成功\n");
printf("消费苹果%d个,剩余%d个\n",b,a);
}else{
printf("消费不成功\n");
printf("想要消费苹果%d个不成功,剩余%d个\n",b,a);
}
}
return 0;
}
运行截图:
第四题在时间足够可能出现数据访问问题:
以下进行修改,改为互斥同步的状态
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include<time.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int a=0;//苹果数
int b=0;//每次消费数量
pthread_mutex_t m1;//互斥锁
pthread_mutex_t m2;
pthread_cond_t cond1;//条件变量
void *create(void *arg)//生成苹果
{
while(1)
{
pthread_mutex_lock(&m1);
pthread_cond_wait(&cond1,&m1);//唤醒
a=a+6;//苹果数增加
pthread_mutex_unlock(&m2);
}
}
void* buy(void* arg)
{
while(1)
{
pthread_mutex_lock(&m2);
srand((unsigned)time(NULL));
b=5+rand()%5;//取5-9的随机数
sleep(3);//休眠三秒
if(a>=b)
{
a=a-b;//苹果的剩余量
printf("消费成功\n");
printf("消费苹果%d个,剩余%d个\n",b,a);
}else{
printf("消费不成功\n");
printf("想要消费苹果%d个不成功,剩余%d个\n",b,a);
}
pthread_mutex_unlock(&m1);
}
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&m1,NULL);
pthread_mutex_init(&m2,NULL);
pthread_cond_init(&cond1,NULL);
pthread_t id1,id2;
pthread_create(&id1,0,create,0);
pthread_detach(id1);
pthread_create(&id2,0,buy,0);
pthread_detach(id2);
while(1)
{
pthread_cond_signal(&cond1);//符合条件
}
return 0;
}
运行截图: