3)
合併執行緒:
pthread_join
int pthread_join(pthread_t* thread, void **ret);
第乙個引數為被等待的執行緒識別符號,第二個引數為乙個使用者定義的指標,它可以用來儲存被等待執行緒的返回值。這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被收回。關於什麼是可
join
able的
執行緒,參見
[3]。
4)通過到斥實現執行緒同步(1
)宣告互斥鎖變數:
pthread_mutext_t
mutex;
pthread_mutex_t為不公開的資料型別,其中包含乙個系統分配的屬性物件。(2
)互斥鎖初始化:
pthread_mutex_init(pthread_mutex_t *mymutex, const pthread_mutexattr_t *attr );
第乙個引數接受乙個指標以初始化為互斥物件,該指標指向一塊已分配好的記憶體區。第二個引數,可以接受乙個可選的
pthread_mutexattr_t
指標。這個結構可用來設定各種互斥物件屬性。(3
)鎖定互斥鎖 :
pthread_mutex_lock (&mutex);
pthread_mutex_lock宣告開始用互斥鎖上鎖,此後的**直至呼叫
pthread_mutex_unlock
為止,均被上鎖,同一時間只能被乙個執行緒呼叫執行。(4
)開啟互斥鎖:
pthread_mutex_unlock(&mutex);
示例**
view code
#include(5<
stdio.h
>
#include
<
pthread.h
>
#include
<
stdlib.h
>
#include
<
unistd.h
>
intalltickets=10
;
//假設總共還剩餘十張票
pthread_mutex_t mutex;
//宣告互斥鎖
void
*window1(
void
*arg)
pthread_mutex_unlock(
&mutex);
//對共享資源的訪問完後解鎖
sleep(1);
}}void
*window2(
void
*arg)
pthread_mutex_unlock(
&mutex);
sleep(2);
}}intmain(
void
)
)其他互斥鎖判斷上鎖:
pthread_mutex_trylock()
消除互斥鎖:
pthread_mutex_destroy()
5)通過訊號量實現執行緒同步(1
)基本概念
訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,
呼叫函式
sem_post( )
增加訊號量
。只有當訊號量值大於
0時,才能使用公共資源,使用後,
函式sem_wait( )
減少訊號量
。和訊號量有關的一些函式,它們都在標頭檔案
semaphore.h
中定義。訊號量的資料型別為結構
sem_t
,它本質上是乙個
長整型的數
。函式sem_init( )
用來初始化乙個訊號量。它的原型為:
extern int sem_init _p ((sem_t *sem, int pshared, unsigned int value));
sem為指向訊號量結構的乙個指標;
pshared不為0
時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享;
value
給出了訊號量的初始值。
函式sem_post( sem_t *sem )
用來增加訊號量的值。當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不再阻塞,選擇機制同樣是由執行緒的排程策略決定的。
函式sem_wait( sem_t *sem )
被用來阻塞當前執行緒,直到訊號量
sem的值大於
0,解除阻塞後將
sem的值減一,
表明公共資源
經使用後減少。
函式sem_destroy(sem_t *sem)
用來釋放訊號量
sem。
示例生產者與消費者
view code
#include注意:要用兩個訊號量來標示緩衝的大小,這是實現<
stdio.h
>
#include
<
pthread.h
>
#include
<
semaphore.h
>
#include
<
stdlib.h
>
#include
<
unistd.h
>
#define
n 20
intk =0
;
//儲存現有產品數量
sem_t full;
sem_t empty;
pthread_mutex_t mutex;
void
*producer(
void
*arg)
} void
*consumer(
void
*arg)
} main()
p_c模型的巧妙之處。(2
)圖示
(3)函式sem_init()用於建立乙個訊號量,並初始化它的值。
sem_wait()和
sem_trywait()
都相當於
p操作,在訊號量大於零時它們都能將訊號量的值減一,兩者的區別在於若訊號量小於零時,
sem_wait()
將會阻塞程序,而
sem_trywait()
則會立即返回。
sem_post()相當於
v操作,它將訊號量的值加一同時發出訊號來喚醒等待的程序。
sem_getvalue()用於得到訊號量的值。
sem_destroy()用於刪除訊號量。
參考:【1】
】 】
】 華中科技大學,中山大學
ppt
9 多執行緒小結(2)
3 合併執行緒 pthread join int pthread join pthread t thread,void ret 第乙個引數為被等待的執行緒識別符號,第二個引數為乙個使用者定義的指標,它可以用來儲存被等待執行緒的返回值。這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執...
多執行緒小結(2)
1 private static thread subthread 2private static thread subthread1 3static void main string args 418 19static void getshow 2025 26static void getshow...
多執行緒小結
多執行緒中的4個概念 關鍵段 互斥量 事件和訊號量。其中關鍵段非核心變數,只能用於執行緒間同步問題,而其他的都是核心變數可用於程序間同步。關鍵段和互斥量一般用於互斥,因為他們有執行緒所有權的概念,擁有執行緒所有權的執行緒 通常是主線程 無視約束,可重複進入關鍵段。但是我想在子執行緒之間這個應該是可以...