實驗3程序同步
一、實驗目的
1. 掌握訊號通訊機制,實現程序之間通過訊號進行通訊;
2. 掌握共享記憶體、訊號量通訊實現方法。
二、實驗工具與裝置
裝有linux系統的計算機。
三、實驗內容
1.使用
fork
建立程序,實現兩個程序之間的通訊,乙個程序把乙個變數的值加
5,另乙個程序輸出該變數的值。
#include
#include
#include
#include
#include
int* count ;
sem_t *mutex1 = null;
sem_t *mutex2 = null;
int i = 0;
int main()
mutex1 = (sem_t*)mmap(null, sizeof(sem_t), prot_read|prot_write, map_anon|map_shared, -1, 0);
mutex2 = (sem_t*)mmap(null, sizeof(sem_t), prot_read|prot_write, map_anon|map_shared, -1, 0);
count = (int*)mmap(null,sizeof(int), prot_read|prot_write, map_anon|map_shared, -1,0);
sem_init(mutex1, 1, 1);
sem_init(mutex2, 1, 0);
*count = 5;
if(fork()==0)
for(i=0;i<10;i++){
sem_wait(mutex1);
*count += 5;
printf("child:%d\n",*count);
sem_post(mutex2);
exit(0);
for(i=0;i<10;i++){
sem_wait(mutex2);
printf("father:%d\n",*count);
sem_post(mutex1);
sem_destroy(mutex1);
sem_destroy(mutex2);
munmap(mutex1, sizeof(sem_t));
munmap(mutex2, sizeof(sem_t));
munmap(count, sizeof(int));
return 0;
2 在
linux
下建立執行緒,實現執行緒的通訊,乙個執行緒把乙個變數的值加
5,另乙個程序輸出該變數的值。
#include
#include
#include
#include
#include
int c=5;
sem_t mux1;
sem_t mux2;
pthread_mutex_t mutex;
void * thread1(void *arg)
int i=0;
for(i=0; i<10; i++)
sem_wait(&mux1);
c=c+5;
sem_post(&mux2);
void * thread2(void *arg)
int i=0;
for(i=0; i<10; i++)
sem_wait(&mux2);
printf("c is %d\n",c);
sem_post(&mux1);
int main()
pthread_t th1;
pthread_t th2;
int ret=sem_init(&mux1,0,1);
if(ret!=0)
printf("sem_init error");
exit(0);
ret=sem_init(&mux2,0,0);
if(ret!=0)
printf("sem_init error");
exit(0);
pthread_create(&th1,null,thread1,null);//建立執行緒
pthread_create(&th2,null,thread2,null);
pthread_join(th1,null);//主線程等待子執行緒的終止
pthread_join(th2,null);
exit(0);
注意:因為semaphore, pthread並非
linux
系統的預設庫,編譯時注意加上
-lpthread
引數,以呼叫鏈結庫
四、實驗總結
1.寫出實驗報告。
2.程序之間的,涉及的相關函式完成的主要功能。
sem_wait
就是p操作,
sem_post
就是v操作
首先需要用sem_init(); 初始化sem_t型變數,並設定初始訊號量。比如設定為1.
每次呼叫sem_wait(sem_t *); 訊號量減
1,當呼叫sem_post(sem_t *); 訊號量加1。
當訊號量為0時,sem_wait(); 函式阻塞,等待訊號量 >0 時,才進行。
3.執行緒之間怎麼通訊的,涉及的相關函式完成的主要功能。
pthread_t它是乙個執行緒的識別符號。
函式pthread_create用來建立乙個執行緒.
第乙個引數為指向執行緒
識別符號的指標。
第二個引數用來設定執行緒屬性。
第三個引數是執行緒執行函式的起始位址。
最後乙個引數是執行函式的引數。
pthread_join()的作用:主線程等待子執行緒的終止。也就是在子執行緒呼叫了pthread_join()方法後面的**,只有等到子執行緒結束了才能執行。
pthread_mutex_t mutex
用來生成互斥鎖
在編譯時注意加上-lpthread引數,以呼叫靜態鏈結庫。因為pthread並非linux系統的預設庫
程序同步(一) 程序同步相關概念
在os中引入程序後,雖然提高了資源的利用率和系統吞吐量,但是由於程序的非同步性將會給系統造成混亂,尤其是他們在爭搶臨界資源時。當多個程序去爭用共享變數 鍊錶時,可能導致資料處理出錯。程序同步的任務就是對多個相關程序在執行次序上進行協調,使得併發執行的程序之間能有效地共享資源和相互合作,從而使程式的執...
Linux程序同步
linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...
程序同步問題
有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...