23

タスクを取得してリンクリストであるキューに入れるディスパッチキューのacファイルを作成しています。これを行うには、次を使用してスレッドを作成する必要があります

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

ただし、作成関数のパラメーターとして「work」および「param」変数に入る別の関数を作成する必要があります。私の友人は、スレッドが死なないように無限にループするコードを作業関数に入れるだけでよいと私に言いました。各パラメーターがpthread_create関数に入るのを説明できますか?特にworkandの場合param? これをGoogleで検索しましたが、ほとんどのチュートリアルは概念を理解するのが難しいです...

4

2 に答える 2

43

の 4 つのパラメーターpthread_createは次のとおりです。

  1. pthread_t構造体へのポインターpthread_create。これは、作成するスレッドに関する情報を入力します。

  2. pthread_attr_tスレッドのパラメーターを持つへのポインター。NULLほとんどの場合、安全に通過できます。

  3. スレッドで実行する関数。関数は戻りvoid *、引数を取る必要void *があります。引数は、適切と思われる方法で使用できます。(たとえば、同じ関数で複数のスレッドを開始する場合、このパラメーターを使用してそれらを区別できます。)

  4. void *スレッドを開始する。NULL必要なければパス。

于 2011-08-09T03:02:29.930 に答える
24

夕暮れの答えを明確にする:

workパラメータは関数ポインタです。void *関数は、 typeおよび return valueとして示される 1 つの引数を取る必要がありますvoid *

param受信するデータへのポインターであることが期待されますwork

例として、ワーカーに 2 つの int を渡したいとします。次に、次のようなものを作成できます。

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

その後、作業関数はポインターの型を変換し、param データを取得できます。

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

渡す必要のあるすべてのデータを含む構造体を作成するなど、より複雑なことを行うことができます。

于 2011-08-09T03:10:08.320 に答える