这篇文章会讨论下4个经典的同步模型; 然后会说下死锁的避免,预防,检测和根除。
(1)经典的同步模型
*在操作系统第9版这本书里面, 我找到了4个比较经典的模型。其实大多都是对信号量的灵活运用来叫Race Condition来达到预期效果的小练习。 不知道在以后会不会用得到,不过记录下总是好的。 主要还是这些东西都很有意思。
1. Peterson's Solution(皮特森算法)
#include<stdio.h>
#include<sys/shm.h>
#include<unistd.h>
#include<stdlib.h>
typedefstruct shared_data{
int counter;
}shared_data;
main()
{
int shmid,status;
struct shared_data *data_ptr;
shmid = shmget(IPC_PRIVATE,sizeof(struct shared_data),0664 | IPC_CREAT);
int pid = fork();
if ( pid <0 ){
perror("fork出现错误\n");
}elseif(pid ==0 ){
data_ptr = (struct shared_data*) shmat(shmid,0,0);
for(int i =0; i <1000000; i++ )
data_ptr -> counter ++;
exit(0);
}else{
data_ptr = (struct shared_data*) shmat(shmid,0,0);
for(int i =0; i <1000000; i++ )
data_ptr -> counter ++;
wait(&status);
printf("The Final Counter is%d\n", data_ptr -> counter);
if(!shmdt(data_ptr))
printf("分离进程间共享内存\n");
if(!shmctl(shmid, IPC_RMID,0))
printf("删除共享内存\n");
}
}
测试结果: