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...