web-dev-qa-db-ja.com

C、pthread_create関数を使用してスレッドを作成する方法

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

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

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

18
Leanne

pthread_createの4つのパラメーターは、順番に:

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

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

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

  4. スレッドを開始するvoid *。必要ない場合はNULLを渡します。

33
duskwuff

ダスクワフの答えを明確にする:

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

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

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

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

次に、作業関数はポインター型を変換し、パラメーターデータを取得します。

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

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

21
Foo Bah