2011-08-09 7 views
14

タスクを取得してリンクリストであるキューに入れるディスパッチキュー用のcファイルを作成しています。これを行うために、私は関数を作成するパラメータとして「仕事」と「PARAM」変数に入り、別の関数を作成する必要がありますしかしC、pthread_create関数を使用してスレッドを作成する方法

pthread_t cThread; 
if(pthread_create(&cThread, NULL, work, param)){ 
    perror("ERROR creating thread."); 
} 

を使用してスレッドを作成する必要があります。私の友人は、スレッドが無駄にならないように無限ループするコードを書く必要があることを教えてくれました。誰もがpthread_create関数に入ると説明できますか?特にworkparamについては?私はこのためにグーグルの検索が、チュートリアルのほとんどは、概念を理解するのは難しいです...

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

わかりました。誰かが文章で私のことを説明してくれるようにしておきたい - それぞれのパラメータが何であるか – Leanne

答えて

23

pthread_createに四つのパラメータは順番に、以下のとおりです。

  1. pthread_createpthread_t構造体へのポインタ作成したスレッドに関する情報が記入されます。

  2. スレッドのパラメータを持つpthread_attr_tへのポインタ。あなたはほとんどの時間NULLに安全に渡すことができます。

  3. スレッドで実行する関数。この関数はvoid *を返し、void *引数を取らなければなりませんが、あなたはそれが当てはまると思うかもしれません。たとえば、同じ関数を持つ複数のスレッドを開始する場合は、このパラメータを使用して区別できます。

  4. void *スレッドを起動するスレッドです。必要がない場合はNULLを渡してください。 duskwuffの答えを明確に

16

workパラメータは関数ポインタです。この関数は、タイプvoid *と戻り値void *として示される1つの引数を取る必要があります。

paramは、workが受け取るデータへのポインタになると予想されます。

例として、2つのintをワーカーに渡したいとします。で構造体を作成するように、あなたがより複雑なものを行うことができます

void *work(void * parm) { 
    int *param = (int *)parm; 
    int first_val = param[0]; 
    .... 
} 

int *param = (int *)malloc(2 * sizeof(int)); 
param[0] = 123; 
param[1] = 456; 
pthread_create(&cThread, NULL, work, param); 

その後、あなたの仕事関数はポインタ型に変換し、PARAMデータをつかむことができます。その後、あなたはこのようなものを作成することができますすべてのデータを渡す必要があります。

+6

'malloc'から戻り値をキャストしないでください。その戻り値は 'void *'で、常にどのデータポインタにも代入可能です。 'parm'も同じです。 –

+0

@Jens悪い癖はC++から:/ –

関連する問題