在linxu的多執行緒機制中,由於可能同時對臨界資源進行讀寫操作,因此互斥鎖經常被用來進行互斥操作。
初次之外訊號量和環形佇列等互斥機制則使用起來更為簡單。
#include#include#include#include#define size 1024
//環形佇列
int arr[size] = ;
sem_t sem_pro; //描述環形佇列中的空位置
sem_t sem_con; //描述喚醒佇列中的資料
//生產者,只要環形佇列有空位,便不斷生產
void*productor(void*arg)
}//消費者,只要環形佇列中有資料,就不斷消費
void*consumer(void*arg)}
int main()
佇列具有天然的互斥特性,被廣泛地應用到linux核心 和python中,可以建立工作佇列。另一篇部落格 管道的環形設計方法
有詳細的介紹。
在隊列為空時,生產者必須先執行,消費者不能越過生產者
在隊列為滿時,消費者先執行,生產者不能超過消費者一圈,
不能同時訪問同一位置:
sem_t sem;//posix的執行緒標準下的
訊號量機制通過訊號量的值控制可用資源的數量。執行緒訪問共享資源前,需要申請獲取乙個訊號量,如果訊號量為0,說明當前無可用的資源,執行緒無法獲取訊號量,則該執行緒會等待其他資源釋放訊號量(訊號量加1)。如果訊號量不為0,說明當前有可用的資源,此時執行緒占用乙個資源,對應訊號量減1。
舉例:停車場有5個停車位,汽車可使用停車位。在這裡5個停車位是共享的資源,汽車是執行緒。開始訊號量為5,表明此時有5個停車位可用。一輛汽車進入停車場前,先查詢訊號量的值,不為0表明有可用停車位,汽車進入停車場並使用乙個停車位,訊號量減1,表明占用乙個停車位,可用數減少。
訊號量初始化函式:
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem: 訊號量
pshared:引數表示這個訊號量是否在程序的執行緒之間共享程序之間
value:初始值
nt sem_wait(sem_t *sem);
該函式申請乙個訊號量,當前無可用訊號量則等待,有可用訊號量時占用乙個訊號量,對訊號量的值減1。
訊號量加1:
int sem_post(sem_t *sem);
該函式釋放乙個訊號量,訊號量的值加1。
銷毀訊號量:
int sem_destory(sem_t *sem);
該函式銷毀訊號量。
sem_init(&blanksem, 0, size);//初始化
sem_init(&datasem, 0, 0);
建立全域性陣列 int ring[size] = 0;
void* product(void *arg)//生產者
return null;
}void* consume(void *arg) //消費者
}
訊號量只能實現生產者與消費者之間的·互斥·同步·
現在多生產者和消費者,所以需要加入,互斥鎖實現生產者與生產者之間的互斥,消費者與消費者之間的互斥;
int i = 0;
int n = 0;
int data = 0;
void* product_1(void *arg)//生產者1
return
null;
}void* product_2(void *arg)//生產者2
return
null;
}void* consume_1(void *arg)//消費者1
return
null;
}void* consume_2(void *arg)//消費者2
return
null;
}
基於環形佇列的生產者消費者模型編寫。
1.環形佇列 在隊列為空時,生產者必須先執行,消費者不能越過生產者 在隊列為滿時,消費者先執行,生產者不能超過消費者一圈,不能同時訪問同一位置 2.訊號量sem t sem posix的執行緒標準下的 訊號量機制通過訊號量的值控制可用資源的數量。執行緒訪問共享資源前,需要申請獲取乙個訊號量,如果訊號...
基於鍊錶和環形佇列的生產者消費者模型
在學習系統程式設計當中,有一種很重要的模型,那就是生產者消費者模型,在編寫多執行緒 時候,乙個個執行緒就扮演著生產者,消費者的角色。舉乙個例子,在生活中,我們去商店買東西,那麼我們相當於消費者,而貨物生成廠家就是生產者,商店扮演著交易場所。我們總結為 生產者和生產者 這些廠商在生產貨物的時候,加入都...
基於佇列實現生產者消費者模型
code from multiprocessing import process,queue import time,random,os def consumer q,p1 while true res q.get if res finish break time.sleep random.rand...