** :
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...