linux C 多執行緒程式設計

2021-06-19 08:15:49 字數 3742 閱讀 6003

1.solaris .vs. linux posix 庫

solaris 庫(lib 執行緒)

linux posix 庫(libp 執行緒)

操作sema_destroy()

sem_destroy()

銷毀訊號狀態。

sema_init()

sem_init()

初始化訊號。

sema_post()

sem_post()

增加訊號。

sema_wait()

sem_wait()

阻止訊號計數。

sema_trywait()

sem_trywait()

減少訊號計數。

mutex_destroy()

pthread_mutex_destroy()

銷毀或禁用與互斥物件相關的狀態。

mutex_init()

pthread_mutex_init()

初始化互斥變數。

mutex_lock()

pthread_mutex_lock()

鎖定互斥物件和塊,直到互斥物件被釋放。

mutex_unlock()

pthread_mutex_unlock()

釋放互斥物件。

cond_broadcast()

pthread_cond_broadcast()

解除對等待條件變數的所有執行緒的阻塞。

cond_destroy()

pthread_cond_destroy()

銷毀與條件變數相關的任何狀態。

cond_init()

pthread_cond_init()

初始化條件變數。

cond_signal()

pthread_cond_signal()

解除等待條件變數的下乙個執行緒的阻塞。

cond_wait()

pthread_cond_wait()

阻止條件變數,並在最後釋放它。

rwlock_init()

pthread_rwlock_init()

初始化讀/寫鎖。

rwlock_destroy()

pthread_rwlock_destroy()

鎖定讀/寫鎖。

rw_rdlock()

pthread_rwlock_rdlock()

讀取讀/寫鎖上的鎖。

rw_wrlock()

pthread_rwlock_wrlock()

寫讀/寫鎖上的鎖。

rw_unlock()

pthread_rwlock_unlock()

解除讀/寫鎖。

rw_tryrdlock()

pthread_rwlock_tryrdlock()

讀取非阻塞讀/寫鎖上的鎖。

rw_trywrlock()

pthread_rwlock_trywrlock()

寫非阻塞讀/寫鎖上的鎖。

如何在linux 下c+

+中類的成員函式中建立多執行緒

linux系統中線程程式庫是posix pthread。posix pthread它是乙個c的庫,用c語言進行多執行緒程式設計我這裡就不多說了,網上的例子很多。但是如何在c+

+的類中實現多執行緒程式設計呢?如果套用c語言中建立多執行緒的方式,在編譯的時候會出現.

..does not match `void*(*

)(void*).

.這樣的錯誤。出現這種情況的原因是,編譯器在處理c+

+和c檔案上是不同的,也就是說c+

+和c語言裡邊指標函式不等價。解決這種錯誤的方法

有兩種:

1、不要將執行緒函式定義為類的成員函式,但是在類的成員函式裡邊呼叫它。

例如:[test.h]

#ifndef test_h

#define test_h

class test

;#endif

[test.cpp]

test:

:test(

)test:

:~test(

)void *threadfunction(

)void test:

:createthread(

)[main.cpp]

#inlcude "test.h"

int main(

)2、將執行緒函式作為類的成員函式,那麼必須宣告改執行緒函式為靜態的函式,並且該執行緒函式所引用的其他成員函式也必須是靜態的,如果要使用類的成員變數,則必須在建立執行緒的時候通過void *指標進行傳遞。

例如:【test.h】

linux下的程式設計一直是c語言的天下,但老是用c感覺寫的很乏味。用物件導向方法程式設計,聽著都倍有面子。於是決定先在的這個專案用c+

+來寫。雖然不一定能「以c+

+的思想」來寫c+

+,少會有c+

+的樣子。

但是問題來了:我需要在程式中動態建立乙個執行緒,而pthread不接受c+

+類的成員函式作為引數。

原因也很簡單,類成員是在類被例項化成為物件後才存在的,即在編譯時是不存在的,編譯器無法取得函式的確切入口位址,自然無法通過編譯。

照這個分析,如果把要呼叫的類成員函式宣告為靜態的,pthread_create就可以找到函式的位址了。但這樣一來的話,由於類中的靜態函式無法呼叫類的非靜態成員。執行緒函式的功能就受到了很大限制,也就沒有比要將其放在類中了。

最容易想到的解決方案就是寫個c函式,然後再c函式中呼叫c+

+物件的成員函式。

比如類為

class foo(

)class

*f;void *bar(void *arg)

int main(

)顯然這種發法太笨了,而且物件只能是全域性的。

注意到執行緒函式bar可以有乙個任意型別的指標作為引數,那我們何不將物件通過這個指標將物件變為bar的乙個引數,從而讓我們的程式好看一些。

class foo(

)void *bar(void *args)

int main(

)如果把上述兩種方法結合起來即物件中的靜態函式+通過指標引數傳遞物件,那又會怎麼樣呢?

class foo()}

int main(

)其他參考網頁

linux C 多執行緒程式設計

1.solaris vs.linux posix 庫 solaris 庫 lib 執行緒 linux posix 庫 libp 執行緒 操作sema destroy sem destroy 銷毀訊號狀態。sema init sem init 初始化訊號。sema post sem post 增加訊號...

Linux C 多執行緒程式設計條件變數

二 條件變數 這裡主要說說 pthread cond wait 的用法,在下面有說明。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 一 個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合...

Linux C 多執行緒程式設計學習筆記

includedefault 1 thread noexcept initialization 2 template explicit thread fn fn,args args copy deleted 3 thread const thread delete move 4 thread thr...