實驗3程序同步

2021-08-13 10:29:20 字數 3221 閱讀 6493

實驗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.訊息佇列是...

程序同步問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...