9 多執行緒小結(2)

2022-02-12 09:22:40 字數 3537 閱讀 9762

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 

<

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

)

(5

)其他互斥鎖判斷上鎖:

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個概念 關鍵段 互斥量 事件和訊號量。其中關鍵段非核心變數,只能用於執行緒間同步問題,而其他的都是核心變數可用於程序間同步。關鍵段和互斥量一般用於互斥,因為他們有執行緒所有權的概念,擁有執行緒所有權的執行緒 通常是主線程 無視約束,可重複進入關鍵段。但是我想在子執行緒之間這個應該是可以...