pthread執行緒使用小結

2021-09-30 08:34:26 字數 2338 閱讀 4261

pthread執行緒使用小結

1.奇怪的執行緒引數初始化

for( i=0; i

上面**應該很容易明白,建立多個執行緒,傳入序列號作為執行緒id

。基實這裡存在乙個大

bug, 傳遞的引數會不成功!!

示例**:

輸出:gcc -o test_thread test_thread.c -lpthread

./test_thread 3

client id 3

client id 3

client id 3

為什麼呢?注意其實傳遞時i

是區域性變數,而執行緒的建立是有延時的,所以當多次呼叫時,執行緒函式還沒執行。但是這裡

i已經為

3了。當執行緒函式開始執行,讀入的引數自然都為

3了,這個小細節真可謂令我大傷腦筋呀:)

稍作修改即可:

...int * a = (int*)malloc( n* sizeof(int) );

for( i=0; i

pthread_join( tid, null );

...這樣就可以儲存引數不變了。

2. pthread_mutex_t / pthread_cond_t初始化/釋放

作為乙個全域性變數時可以使用:

pthread_mutex_t g_mtx = pthread_mutex_initializer;

pthread_cond_t g_cond = pthread_cond_initializer;

如果有多個可使用:

pthread_mutex_init( &g_mtx , null);

pthread_cond_init( &g_cond , null);

釋放:

pthread_mutex_destroy( &g_mtx );

pthread_mutex_destroy( &g_mtx );

3. 同步條件pthread_cond_t使用

1)需要配合mutex使用

pthread_mutex_lock( &g_mtx );

pthread_cond_wait( &g_cond , &g_mtx );

pthread_mutex_unlock( &g_mtx );

使用pthread_cond_wait 

需要在 

lock/unlock 

之間,以防止在進入

wait

狀態前有

signal

。需要先

lock, 

一旦進行

wait

狀態,會釋放 

mutex

的lock

。而一旦有收到

signal

訊號就會自動重新獲到

mutex

的lock

。而且cond

的lock

是原子操作。

在需要的地方進行 pthread_cond_signal( g_cond ), 

之前的wait 

位置就可以執行,達到多個執行緒同步。

2)使用超時條件

struct timespec tv;

tv.tv_sec = time(0) + 1;

tv.tv_nsec = 0;

ret = pthread_cond_timedwait( &g_cond , &g_mtx ,&tv );

指定超時結構體timespec

,注意超時時間是當前時間,所以要設定為

time(0) + n

秒。timespec 

可精確到納秒。

3)多個執行緒序列執行

只需要在全域性設定乙個處理序列號,這樣每個執行緒在執行前判斷是否為自己要處理的序號,否則繼續wait, 

處理框架如下:

void* thread_client_function( void* param )

while ( g_do[client_id][i] != g_idx ); //判斷是否為當前處理序列,否則繼續等待

...}void* thread_server_function( void* param )

...}

上面使用了多個cond

的處理,也可以直接使用乙個

cond, 

使用pthread_cond_broadcast

響醒所有等待的執行緒。

pthread執行緒使用小結

1.奇怪的執行緒引數初始化 for i 0 i 上面 應該很容易明白,建立多個執行緒,傳入序列號作為執行緒id 基實這裡存在乙個大 bug,傳遞的引數會不成功!示例 include include include include include void thread client function...

pthread執行緒使用範例

使用pthread執行緒庫時,應該包含標頭檔案pthread.h include編譯時需要加上 lpthread鏈結該庫 建立執行緒使用介面 int pthread create pthread t tidp,const pthread attr t attr,void start rtn void...

多執行緒pthread使用

pthread create 標頭檔案 include 原型 int pthread create pthread t tidp,const pthread attr t attr,void start rtn void void arg 作用 建立乙個執行緒 返回值 執行緒建立成功返回0,建立失敗...