1.核心理論
- 程序的同步:是指一組并發的程序互相合作互相等待,使得各程序按照一定的順序執行的過程叫做程序同步。
-
同步與互斥的差別:同步時信号量初始值為0,互斥時信号量初始值大于0。
解釋:如果用信号量互斥的話,必須是生産者程序先執行。如果采用信号量同步的話,那麼那麼生産者和消費者的執行順序不影響結果
2.程序同步程式設計執行個體
-
消費者與生産者的關系
生産者程序:建立一個檔案,向檔案中寫入字元,二者之間穿插一些休息
消費者程序:該程序在生産者休息期間,讀取檔案内容,導緻中間出現一些問題。
簡單來說就是必須要先生産完成,然後才能消費。
- 生産者完成任務是才釋放信号量。
- producter.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
void main()
{
int fd;
key_t key;
int semid;
struct sembuf sops;
//建立一個鍵值
key = ftok("home",);
//建立一個信号量
semid = semget(key,,IPC_CREAT);
semctl(semid,,SETVAL,);
fd = open("./pro.txt",O_RDWR|O_CREAT|O_APPEND,);
sleep();
write(fd,"welcome,linux!",);
//釋放信号量
sops.sem_num = ;
sops.sem_op = ;
sops.sem_flg = SEM_UNDO;
semop(semid,&sops,);
close(fd);
}
- consumer.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
void main()
{
key_t key;
int semid;
int ret;
struct sembuf sops;
key = ftok("home",);//建立一個鍵值
semid = semget(key,,IPC_CREAT);//擷取信号量
//IPC_CREAT指令如果鍵值不存在就建立
/*法一:通過輪尋檢視信号量是否釋放
ret = semctl(semid,0,GETVAL);
printf("%d\n",ret);
while(!(ret))
ret = semctl(semid,0,GETVAL); */
//法二:采用信号量機制
sops.sem_num = ;//要操作的信号量序号
sops.sem_op = -;//設定為自減1
sops.sem_flg = SEM_UNDO;//要操作的信号量序号
semop(semid,&sops,);//執行操作
system("cp ./pro.txt ./temp");
}