Linux生產者消費者模型實現

2021-09-01 05:00:32 字數 2314 閱讀 2912

任何語言提及到多執行緒同步都離不開生產者/消費者模型。這也是針對許多現實問題建模用到的基礎模型。這一篇就來看一下在linux環境下,c語言實現的兩種生產者和消費者模型。

關鍵字:linux c 生產者 消費者

條件變數都會和互斥鎖進行配合使用。首先來回顧一下條件變數的控制原語。

pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr) //初始化建立

pthread_cond_destroy(pthread_cond_t *cond) //銷毀

pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex) //阻塞等待條件變數,同時釋放互斥量,兩步為一原子操作

pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict cond) //限時等待

pthread_cond_signal(pthread_cond_t *cond) //喚醒至少乙個

pthread_cond_broadcast(pthread_cond_t *cond) //喚醒所有

在使用條件變數時,我們至少需要兩個條件變數和乙個互斥量

pthread_cond_t cond_not_empty = pthread_cond_initializer;

pthread_cond_t cond_not_full = pthread_cond_initializer;

pthread_mutex_t mutex_lock = pthread_mutex_initializer;

那麼,此時的生產消費模型應該是醬的。

由此一來,該模型的實現就變為多執行緒對一臨界區的操作問題。

首先是生產者

void *producer(void *arg)

insert_data();

pthread_mutex_unlock(&unlock);

pthread_cond_signal(&cond_not_empty);

sleep_for_some_time();}}

然後是消費者

void *consumer(void *arg)

delete_data();

pthread_mutex_unlock(&mutex_lock);

sleep_for_some_time();}}

邏輯很清晰,只不過在使用條件變數時,重點需要注意的是pthread_cond_wait的特性及使用。在等待條件變數時,會釋放互斥量,被喚醒時會重新加鎖。同時考慮到有多個消費者的情況,採用了while迴圈加鎖。

同樣,首先來回顧一下訊號量的控制原語

sem_init(sem_t *sem, int pshared, unsigned int value)

sem_destroy(sem_t *sem)

sem_wait(sem_t *sem)

sem_trywait(sem_t *sem)

sem_post(sem_t *sem)

通過訊號量實現的模型和條件變數略有不同。因為乙個執行緒不應該既是生產者,又是消費者,所以同乙個執行緒不能同時實現訊號量的p和v操作。在這種情況下,應該存在兩個訊號量。例如,訊號量的容量為10,那麼同一時刻,兩個訊號量的當前值之和應該為10。此時,生產消費模型應該是醬的。

首先我們要有兩個訊號量

sem_init(&sem_blank, 0, 10);

sem_init(&sem_filled, 0, 0);

生產者**

void *producer(void *arg)

}

消費者**

void *consumer(void *arg)

}

完。

Linux 生產者消費者模型

生產者消費者模型 為什麼要使用生產者消費者模型?生產者消費者模型遵循 基於生產者消費者模型的阻塞佇列 include include include include include include using namespace std class blockqueue void unlockque...

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...