pthread create 引數傳遞指標問題

2021-06-20 12:55:32 字數 1628 閱讀 5403

linux 下常用的建立多執行緒函式pthread_create(pthread_t * thread , pthread_attr_t * attr , void *(*start_routine)(void*) , void *args);其中第乙個引數用來儲存執行緒資訊,第二個引數指新執行緒的執行屬性,可以設定為null,第三個引數為自定義的執行緒函式,第四個引數就是執行緒函式需要用到的引數,一般如果要傳遞多個引數,可以設定為結構體(struct)型別,這裡我們使用int型別的變數。 下面我著重討論乙個用for結構來建立多個執行緒時引數傳遞的問題

先看下面的例子,後面附有結果,先不要看,猜測一下會有什麼樣的輸出:

#include

#include

#include

using namespace std;

#define th_pop 20 //

pthread_mutex_t mutex;

pthread_t a_thread[th_pop];

void * thread_func(void *args)

該塊快速執行完成,並且將i置為20,故而傳遞的位址指向的內容為20,同時其它的執行緒還沒來得及執行int t_id = *(int*)args;,這樣就使得多個執行緒都指向同乙個位址,內容為20,解決該問題的乙個辦法為在for迴圈中加入sleep(1),這樣當sleep時間大於執行緒函式執行時間,就可以得到乙個正確的結果,不過這種辦法剝掉了併發性,並不可取,下面我們採用另一種方法。

我們只修改init()函式

void init()

//wait the end of the threads;

for(int i=0; i

pthread_mutex_destroy(&mutex);

}下面輸出結果

the id of this thread is 0

the id of this thread is 4

the id of this thread is 2

the id of this thread is 5

the id of this thread is 1

the id of this thread is 3

the id of this thread is 6

the id of this thread is 7

the id of this thread is 8

the id of this thread is 9

the id of this thread is 10

the id of this thread is 11

the id of this thread is 12

the id of this thread is 13

the id of this thread is 14

the id of this thread is 15

the id of this thread is 16

the id of this thread is 17

the id of this thread is 18

the id of this thread is 19

從這個例子中我們應該明白,

要避免直接在傳遞的引數中傳遞發生改變的量,否則會導致結果不可測

pthread create引數傳遞

說明 本文 多執行緒程式設計之pthread create函式應用,在此基礎上筆者做了些許改動。pthread create函式 函式簡介 pthread create是unix環境建立執行緒函式 標頭檔案 include 函式宣告 int pthread create pthread t rest...

pthread create 引數傳遞指標問題

pthread create 引數傳遞指標問題 2010 11 04 15 52 linux 下常用的建立多執行緒函式pthread create pthread t thread pthread attr t attr void start routine void void args 其中第乙個...

pthread create 函式用法

天開始學習linux下用c開發多執行緒程式,linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。include int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void s...