條件變數(pcb等待佇列)
舉個例子:
結果與我們的初衷完全不一樣,這就是執行緒完全問題。
互斥鎖中的計數器如何保證原子性?
獲取資源的時候:
1.暫存器中的值賦值為0
2.將暫存器中的值與記憶體的值交換
3.判斷暫存器的值,得出結果
在第二步交換的過程中,系統通過xchgb交換操作,該操作是彙編**,一次性完成,該操作保證了原子性。
1.互斥鎖的初始化
int
pthread_mutex_init
(pthread_mutex_t *_mutex,_const pthread_mutex_mutexattr_t* _mutexattr)
2.加鎖
int
pthread_mutex_lock
(pthread_mutex_t *mutex)
;
3.解鎖
int
pthread_mutex_unlock
(pthread_mutex_t*mutex);
4.互斥鎖的銷毀
pthread_mutex_destroy (pthread_mutex_t*
);
建立四個執行緒,每個執行緒在搶票時候進行加鎖,結束後解鎖。
注意:
它可以使用在資源不滿足的情況下處於休眠狀態,讓出cpu資源,而資源狀態滿足時喚醒執行緒1.初始化
int
pthread_cond_init
(pthread_cond_t* cond,pthread_condattr_t* attr)
2.等待:將呼叫該介面的執行緒放到pcb等待佇列當中
int
pthread_cond_wait
(pthread_cond_t* cond,pthread_mutex_t* mutex)
;
3.喚醒
int
pthread_cond_siganl
(pthread_cond_t* cond)
int pthread_cond_broadcast (pthread_cond_t*cond)
4.釋放
int pthread_cond_destroy (pthread_cond_t* cond)
結合條件變數實戰一下消費者模型:消費者吃麵,生產者做麵,當碗裡沒麵時,將消費真放進pcb等待佇列,做好後有生產者通知其出隊,當碗裡有麵的時,將生產者放入pcb等待佇列,當碗裡吃完的時候由消費者通知其做麵。
#include
#include
#include
#define threadcount 2
int g_bowl =0;
pthread_mutex_t g_mut;
pthread_cond_t g_cond;
void
*eatstart
(void
* arg)
printf
("i am %p, i eat %d\n"
,pthread_self()
, g_bowl)
; g_bowl--
;pthread_mutex_unlock
(&g_mut)
;pthread_cond_signal
(&g_cond);}
return
null;}
void
*makestart
(void
* arg)
g_bowl++
;printf
("i am %p, i make %d\n"
,pthread_self()
, g_bowl)
;pthread_mutex_unlock
(&g_mut)
;pthread_cond_signal
(&g_cond);}
return
null;}
intmain()
ret =
pthread_create
(&product[i]
,null
, makestart,
null);
if(ret <0)
}for
(int i =
0; i < threadcount; i++
)pthread_mutex_destroy
(&g_mut)
;pthread_cond_destroy
(&g_cond)
;return0;
}
Linux下執行緒
此文講述的執行緒為linux下,其執行緒庫函式是由posix標準定義的,稱為posix thread或者pthread。在linux上線程函式位於libpthread共享庫中,因此在編譯時要加上 lpthread選項。建立執行緒 終止執行緒 等待執行緒 三個函式都為pthread.h中定義,其中要注...
Linux下執行緒實現
1.執行緒概述 程序是系統中程式執行和資源分配的基本單位。每個程序有自己的資料段 段和堆疊段。執行緒通常叫做輕型的程序。執行緒是在共享記憶體空間中併發執行的多道執行路徑,他們共享乙個程序的資源。因為執行緒和程序比起來很小,所以相對來說,執行緒花費更少的cpu資源。2.執行緒建立和退出 在linux中...
Linux下執行緒的操作
01 7 27 上午 10 39 13 介紹在linux下執行緒的建立和基本的使用。linux下的執行緒是乙個非常複雜的問題,由於我對執行緒的學習不時很好,我在這裡只是簡單的介紹執行緒的建立和基本的使用,關於執行緒的高階使用 如執行緒的屬性,執行緒的互斥,執行緒的同步等等問題 可以參考我後面給出的資...