作業系統上機程式設計2 unixc實現程序同步

2021-08-02 10:16:25 字數 3775 閱讀 3343

pc1.c: 使用條件變數解決生產者、計算者、消費者問題

pc2.c: 使用訊號量解決生產者、計算者、消費者問題

初始化條件變數

#include

int pthread_cond_init(pthread_cond_t*cond,const pthread_condattr_t* attr);

int pthread_cond_destory(pthread_cond_t*cond);

等待條件變數滿足

#include

int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);

通知條件變數滿足

#include

int pthread_cond_signal(pthread_cond_t* cond);

注:所謂的條件變數並沒有控制所謂的條件,一般需要我們在外圍增加判斷條件.所以,條件變數一般的使用方式是:

->最原始

///

////

#thread1

if(條件不滿足)

/////

#thread2

pthread_cond_signal(&cond)

說明:上述只是最簡單的條件變數的實現方式.其中會造成的問題就是:如果程式中執行著多個執行緒1,那麼在if語句判斷結束之後,在wait函式執行之前.被中斷,而在中斷執行緒中改變條件,使得條件滿足,再次切換到thread1中的時候,由於程式已經執行過判斷條件.就會出現前後不一致的問題!所以我們需要增加乙個互斥量,保護條件中涉及到的變數的安全,也就是保證執行緒安全!這也就是為什麼條件變數要與互斥量共用的原因.

->修改1:

pthread_mutex_t mutex;

pthread_cond_t cond;

#thread1

pthread_mutex_lock(&mutex);

if(條件不滿足)

pthread_mutex_unlock(&mutex);

/#thread2

pthread_cond_signal(&cond)

執行過程:thread1獲得mutex鎖->thread1判斷條件不滿足->thread1呼叫cond_wait函式(執行緒掛起+釋放mutex鎖)->thread2呼叫signal(喚醒所有的被該條件變數阻塞的程序)->執行結束.

雖然看起來好像已經可以啦,但是還有乙個問題沒有解決就是使用while還是if的問題.關於這個問題.可以參考下面這篇部落格

->修改2

pthread_mutex_t mutex;

pthread_cond_t cond;

#thread1

pthread_mutex_lock(&mutex);

while(條件不滿足)

pthread_mutex_unlock(&mutex);

/#thread2

pthread_cond_signal(&cond)

#include

#include

//#include

//變數儲存區

char buff1[5];

char buff2[5];

int index_buff1 = 0;

int index_buff2 = 0;

pthread_mutex_t buff1_mutex;

pthread_mutex_t buff2_mutex;

pthread_cond_t buff1_empty_cond;

pthread_cond_t buff1_full_cond;

pthread_cond_t buff2_empty_cond;

pthread_cond_t buff2_full_cond;

void init_mutex()

void destory_mutex()

void *producer(void *arg)

buff1[index_buff1] = index+'a';

printf("1--------\n");

index_buff1++;

pthread_cond_signal(&buff1_full_cond);

pthread_mutex_unlock(&buff1_mutex);

}return (void*)0;

}void *lowtoup(void *arg)

while(index_buff2>=4)

printf("2--------\n");

index_buff1--;

buff2[index_buff2] = buff1[index_buff1]-32;

index_buff2++;

pthread_cond_signal(&buff1_empty_cond);

pthread_cond_signal(&buff2_full_cond);

pthread_mutex_unlock(&buff2_mutex);

pthread_mutex_unlock(&buff1_mutex);

}return (void*)0;

}void *consume(void *arg)

index_buff2--;

printf("3--------%c\n",buff2[index_buff2]);

pthread_cond_signal(&buff2_empty_cond);

pthread_mutex_unlock(&buff2_mutex);

}return (void*)0;

}int main()

訊號量機制就是傳統的pv操作.當資源不足的時候等待,當資源充足的時候,等待系統的執行緒排程.不存在上述條件變數所謂的通知.下面直接貼**,很簡單.

#include

#include

#include

#include

#include

//儲存變數

char buff1[5];

char buff2[5];

int index_buff1 = 0;

int index_buff2 = 0;

//定義兩個buff的互斥訊號量

sem_t buff1_mutex;

sem_t buff2_mutex;

//定義程序內的互斥訊號量

sem_t buff1_full;

sem_t buff1_empty;

sem_t buff2_full;

sem_t buff2_empty;

void init_mutex()

void destroy_mutex()

void *producer(void *arg)

return (void*)0;

}void *lowtoup(void *arg)

return (void*)0;

}void *consume(void *arg)

return (void*)0;

}int main()

作業系統 2 作業系統介面

介面是什麼?使用者用很熟悉的東西進入系統 連線兩個東西 訊號轉換 遮蔽細節.第一部分 作業系統介面 首先從命令列和圖形介面來引入我們作業系統介面的介紹 命令列是一段程式,系統初始化完之後便進入這段程式,這個程式是乙個死迴圈,不斷等待著使用者敲入命令。圖形介面是包括畫圖的c程式 c語言邏輯 重要函式 ...

作業系統2

儲存器歷來都是計算機系統的重要部分。儲存器的多層結構 對於計算機而言,儲存層次至少分為三層 cpu暫存器 主存 輔存。還可以根據具體功能細分為 暫存器 快取記憶體 主儲存器 磁碟快取 固定硬碟 可移動儲存介質。暫存器 快取記憶體 主儲存器 磁碟快取均屬於作業系統儲存管理的管轄範圍,斷電後資訊不再存在...

C語言 unix c 計算機的作業系統

計算機的作業系統就是管理計算機資源的一款系統軟體,包括硬體資源和軟體資源 sudo 是允許系統管理員讓普通使用者執行一些或者全部的root命令的乙個工具 bash bash gnu bourne again shell 是許多linux平台的內定shell,事實上,還有許多傳統unix上用的shel...