Linux應用程式設計 多執行緒

2021-10-06 00:15:27 字數 2498 閱讀 7471

執行緒優點是執行緒的上下文切換的開銷比建立程序小很多。在 linux 中,一般 pthread 執行緒庫是一套通用的執行緒庫,是由 posix 提出的,因此具有很好的可移植性。

pthread_create()、 pthread_exit()、pthread_join()、 pthread_cancel() 、pthread_setcancel()函式和 pthread_setcanceltype()

建立執行緒pthread_create(),執行緒建立以後,就開始執行相關的執行緒函式,在該函式執行完之後,該執行緒也就退出了,這也是執行緒退出一種方法。乙個執行緒另外的退出方法有三種

執行緒主動結束

呼叫pthread_exit((void *retval)

等待某個執行緒結束後結束自身

呼叫pthread_join((pthread_t th, void **thread_return))

pthread_join()可以用於將當前執行緒掛起來等待執行緒的結束。這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源就被收回。

被其他執行緒結束

其他執行緒呼叫pthread_cancel((pthread_t th))。

在被取消的執行緒的內部需要呼叫 pthread_setcancel()函式和 pthread_setcanceltype()函式設定自己的取消狀態

被取消的執行緒接收到另乙個執行緒的取消請求之後,是接受還是忽略這個請求;如果接受,是立刻進行終止操作還是等待某個函式的呼叫等。 

互斥鎖線程控制 :

互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。這個互斥鎖只有兩種狀態,也就是上鎖和

解鎖,可以把互斥鎖看作某種意義上的全域性變數。在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖

狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖乙個已經被上鎖的互斥鎖,則該執行緒就會掛起,

直到上鎖的執行緒釋放掉互斥鎖為止。可以說,這把互斥鎖保證讓每個執行緒對共享資源按順序進行原子操作。 

互斥鎖機制主要包括下面的基本函式。 

  互斥鎖初始化:pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 

  互斥鎖上鎖:pthread_mutex_lock(pthread_mutex_t *mutex) 

  互斥鎖判斷上鎖:pthread_mutex_trylock(pthread_mutex_t *mutex) 

  互斥鎖接鎖:pthread_mutex_unlock(pthread_mutex_t *mutex) 

  消除互斥鎖:pthread_mutex_destroy(pthread_mutex_t *mutex)

其中,互斥鎖可以分為快速互斥鎖、遞迴互斥鎖和檢錯互斥鎖。

這 3 種鎖的區別主要在於其他未占有互斥鎖的執行緒在希望得到互斥鎖時是否需要阻塞等待。

訊號量執行緒控制:

pthread_create()函式的第二個引數(pthread_attr_t *attr)表示執行緒的屬性,,將該值設為 null,也就是採用預設屬性,執行緒的多項屬性都是可以更改的。這些屬性主要包括繫結屬性、分離屬性、堆疊位址、堆疊大小以及優先順序。其中系統預設的屬性為非繫結、非分離、預設 1m 的堆疊以及與父程序同樣級別的優先順序。

  繫結屬性。 

前面已經提到,linux 中採用「一對一」的執行緒機制,也就是乙個使用者執行緒對應乙個核心執行緒。繫結屬性就是指乙個使用者執行緒固定地分配給乙個核心執行緒,因為 cpu 時間片的排程是面向核心執行緒(也就是輕量級程序)的,因此具有繫結屬性的執行緒可以保證在需要的時候總有乙個核心執行緒與之對應。而與之對應的非繫結屬性就是指使用者執行緒和核心執行緒的關係不是始終固定的,而是由系統來控制分配的。 

  分離屬性。 

分離屬性是用來決定乙個執行緒以什麼樣的方式來終止自己。在非分離情況下,當乙個執行緒結束時,它所占用的系統資源並沒有被釋放,也就是沒有真正的終止。只有當 pthread_join()函式返回時,建立的執行緒才能釋放自己占用的系統資源。而在分離屬性情況下,乙個執行緒結束時立即釋放它所占有的系統資源。這裡要注意的一點是,如果設定乙個執行緒的分離屬性,而這個執行緒執行又非常快,那麼它很可能在 pthread_create()函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這時呼叫pthread_create()的執行緒就得到了錯誤的執行緒號。 

這些屬性的設定都是通過特定的函式來完成的,通常首先呼叫 pthread_attr_init()函式進行初始化,之後再呼叫相應的屬性設定函式,最後呼叫 pthread_attr_destroy()函式對分配的屬性結構指標進行清理和**。設定繫結屬性的函式為 pthread_attr_setscope(),設定執行緒分離屬性的函式為 pthread_attr_setdetachstate(),設定執行緒優先順序的相關函式為 pthread_attr_getschedparam()(獲取執行緒優先順序)和 pthread_attr_setschedparam()(設定執行緒優先順序)。在設定完這些屬性後,就可以呼叫 pthread_create()函式來建立執行緒了。

Linux串列埠應用程式設計

常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...

Linux應用程式設計 mmap

二話不說,上來就問下那個man name mmap,munmap map or unmap files or devices into memory synopsis include void mmap void addr,size t length,int prot,int flags,int f...

IAP 應用程式設計

1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...