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,建立失敗...