多執行緒的使用

2021-09-14 05:00:14 字數 2837 閱讀 9097

執行緒同步的機制包括:互斥鎖,讀寫鎖,自旋鎖,條件變數,訊號量,非同步訊號

讀寫鎖:

讀寫鎖與互斥量類似,不過讀寫鎖允許更高的並行性。適用於讀的次數大於寫的次數的資料結構。

一次只有乙個執行緒可以占有寫模式的讀寫鎖,但是多個執行緒可以同時占有讀模式的讀寫鎖

自旋鎖:

互斥量阻塞執行緒的方式是使其進入睡眠,而自旋鎖是讓執行緒忙等,即不會使其睡眠,而是不斷循判斷自旋鎖已經被解鎖。

適用於占用自旋鎖時間比較短的情況。

條件變數:

給多個執行緒提供乙個會合的場所,條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定條件的發生;

訊號量和非同步訊號:

介紹一下posix(posix標準定義了作業系統應該為應用程式提供的介面標準,換句話說,為乙個posix相容的作業系統編寫的程式,應該可以在任何其它的posix作業系統(即使是來自另乙個廠商)上編譯執行。)的訊號量機制,定義在標頭檔案/usr/include/semaphore.h

1)初始化乙個訊號量:sem_init()

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

pshared為0時表示該訊號量只能在當前程序的執行緒間共享,否則可以程序間共享,value給出了訊號量的初始值。

2)阻塞執行緒

sem_wait(sem_t* sem)直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少;sem_trywait(sem_t* sem)是wait的非阻塞版本,它直接將sem的值減一,相當於p操作。

3)增加訊號量的值,喚醒執行緒

sem_post(sem_t* sem)會使已經被阻塞的執行緒其中的乙個執行緒不再阻塞,選擇機制同樣是由執行緒的排程策略決定的。相當於v操作。

3)釋放訊號量資源

sem_destroy(sem_t* sem)用來釋放訊號量sem所占有的資源

pthread_mutex_t mutex;

sem_t full,empty;

void producer(void* arg)

}void consumer(void* arg)

}

屬性的初始化以及銷毀

#include int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread_attr_t *attr);

detachstate屬性的分離狀態:

它所占用的資源;

detachstate有兩個合法值:

pthread_create_detached以分離狀態啟動執行緒;

pthread_create_joinable正常啟動執行緒;

int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate);

int pthread_attr_setdetachstate(const pthread_attr_t *attr, int *detachstate);

stacksize屬性:

如果希望改變預設棧的大小,又不想自己處理執行緒棧的分配問題,這時使用pthread_attr_setstacksize函式非常有用;

int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

stackaddr屬性:

對於程序來說,虛擬位址的大小是固定的,因為程序中只有乙個棧,所以它的大小通常不是問題;但對於執行緒來說,同樣大小的虛擬位址空間必須被所有的執行緒棧共享,如果應用程式使用了很多執行緒,以至於這些執行緒棧的累計大小超過了可用的虛擬位址空間,就需要減小預設的執行緒棧的大小;

棧消耗較大的兩種情況:執行緒呼叫的函式分配了大量的自動變數、呼叫的函式涉及很深的棧幀;

如果執行緒的虛擬位址空間用完了,可以使用malloc或者mmap來為替代的棧分配空間;

int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize);

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);

guardsize屬性:

控制著執行緒棧末尾之後用以避免棧溢位的擴充套件記憶體的大小;

int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize);

int pthread_attr_setstack(const pthread_attr_t *attr, void *stackaddr, size_t stacksize);

多執行緒的使用

建立子執行緒的幾種方式 第一種方式 使用執行緒類 nsthread nsthread detachnewthreadselector selector task1 totarget self withobject nil 第二種方式 使用執行緒類,需要手動開啟子執行緒 nsthread thread...

多執行緒的使用

using system using system.threading namespace 15.1thread 正在執行測試方法 thread.currentthread.name static void main string args 乙個可能的情況,因為多執行緒是並行的,不能確定每一次具體的...

多執行緒的使用

package cm.aichijihua public class threadtest1 catch interruptedexception e system.out.println thread.currentthread getname system.out.println this.ge...