基于单链表的生产者消费者问题
『生產者與消費者問題分析』
? ??「原理」生產者生產產品,消費者消費產品。產品如果被消費者消費完了,同時生產者又沒有生產出產品,消費者 ? ? ? ? ? ? 就必須等待。同樣的,如果生產者生產了產品,而消費者沒有去消費,生產者就要在消費者消費了產品之后再 ? ? ? ? ? ? ? ? 生產。生產者和消費者之間既有同步的關系,又存在互斥的部分。
『互斥量(Mutex)』
? ? ?「原理」互斥量是一個可以處于兩態之一的變量:解鎖和加鎖。互斥量僅僅適用于管理共享資源或一小段代碼。獲 ? ? ? ? ? ? ?得鎖的線程可以完成“讀—修改—寫”的操作,然后釋放鎖給其他線程。沒獲得鎖的線程只能等待而不能訪 ? ? ? ? ? ? ? ? ? ?問共享數據。“讀—修改—寫”組成一個原子操作,不會在中間被打斷。
? ? ?「使用方法」
? ? ? ? ? ? ? ? ? ?pthread_mutex_t Mutex;聲明Mutex;
? ? ? ? ? ? ? ? ? ?int?pthread_mutex_init(pthread_mutex_t* restrict mutex, const pthread_mutexattr_t *restrict ? ? ? ? ? ? ? ? ? ? ? ? ?attr);初始化Mutex。成功返回0,失敗返回錯誤號;
? ? ? ? ? ? ? ? ? int pthread_mutex_destroy(pthread_mutex_t* mutex);用來銷毀由pthread_mutex_init初始化的 ? ? ? ? ? ? ? ? ? ? ? ? Mutex;
? ? ? ? ? ? ? ? ? 如果Mutex變量是靜態分配的,也可以用宏定義PTHREAD_MUTEX_INITIALIZER初始化,相當于用 ? ? ? ? ? ? ? ? ? ? ? ? ?pthread_mutex_init初始化并且attr參數為NULL;
? ? ? ? ? ? ? ? ? int pthread_mutex_lock(pthread_mutex_t* mutex);獲得Mutex完成加鎖操作。如果這時另一個線程已 ? ? ? ? ? ? ? ? 經獲得了這個Mutex,則該線程掛起等待。直到另一個線程釋放這個Mutex;
? ? ? ? ? ? ? ? ? int pthread_mutex_trylock(pthread_mutex_t* mutex);如果Mutex已被某個線程獲得,該函數失敗返回 ? ? ? ? ? ? ? ? EBUSY而不會使線程掛起等待;
? ? ? ? ? ? ? ? ? int pthread_mutex_unlock(pthread_mutex_t* mutex);釋放Mutex解鎖;
? ? ?「lock和unlock」
? ? ? ? ? ? ? ? ??假設Mutex的值為1表示互斥鎖空閑,此時某個線程調用lock可以獲得鎖,Mutex的值變為0表示互斥鎖已 ? ? ? ? ? ? ? ? 被某個線程獲得,如果其它線程調用lock則掛起等待。
? ? ??
『條件變量(Condition Variable)』
? ? ??「原理」條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包含兩個動作:一個線程等待“條件 ? ? ? ? ? ? ? ? ?變量條件成立”而掛起,另一個線程使“條件成立”(給出條件成立信號)。為了防止競爭,條件變量的使 ? ? ? ? ? ? ? ? ? 用總是和一個互斥鎖結合在一起。
? ? ?「使用方法」
? ? ? ? ? ? ? ? ? ??int?pthread_cond_init(pthread_cond_t* restrict cond,?const pthread_condattr_t *restrict attr);初 ? ? ? ? ? ? ? ? ? ? 始化一個條件變量。成功返回0,失敗返回錯誤號;
? ? ? ? ? ? ? ? ? ??int pthread_cond_destroy(pthread_cond_t* cond);函數銷毀一個條件變量;
? ? ? ? ? ? ? ? ? ??如果cond變量是靜態分配的,也可以用宏定義PTHREAD_COND_INITIALIZER初始化,相當于用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? pthread_cond_init初始化并且attr參數為NULL;
? ? ? ? ? ? ? ? ? ? int pthread_cond_wait(pthread_cond_t *restrict cond,?pthread_mutex_t *restrict mutex);一個線程 ? ? ? ? ? ? ? ? ? 可以調用這個函數在一個條件變量上阻塞等待。這個函數有三個操作:釋放Mutex,阻塞等待,當被喚醒 ? ? ? ? ? ? ? ? ? ? ? 時重新獲得Mutex并返回;
? ? ? ? ? ? ? ? ? ? int pthread_cond_timedwait(pthread_cond_t *restrict cond,?pthread_mutex_t *restrict ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mutex,?conststruct timespec *restrict abstime);函數還有一個額外的參數設定等待超時,如果達到了 ? ? ? ? ? ? ? ? ? ? ? ? ? abtime所指定的時刻仍沒有被別的線程喚醒當前線程,就返回ETIMEDOUT;
? ? ? ? ? ? ? ? ? ? int pthread_cond_signal(pthread_cond_t *cond);函數喚醒條件變量上另一個等待的線程;
? ? ? ? ? ? ? ? ? ? int pthread_cond_broadcast(pthread_cond_t *cond);喚醒條件變量上的所有線程;
『生產者與消費者問題實現』
? ? ? 「說明」生產者生產一個產品放在單鏈表的表頭上,消費者從表頭上消費產品。
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ??「運行結果」
? ? ? ? ? ? ??
總結
以上是生活随笔為你收集整理的基于单链表的生产者消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 得多囊卵巢的人多吗
- 下一篇: oppo手机乐播投屏教程