1. ホーム
  2. c

[解決済み] pthread_create が動作しない。引数 3 の警告を渡す。

2022-02-14 23:52:37

質問内容

スレッドを作成しようとしているのですが、私の記憶では、これが正しい方法であるはずです。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

int SharedVariable =0;
void SimpleThread(int which)
{
    int num,val;
    for(num=0; num<20; num++){
        if(random() > RAND_MAX / 2)
            usleep(10);
        val = SharedVariable;
        printf("*** thread %d sees value %d\n", which, val);
        SharedVariable = val+1;
    }
    val=SharedVariable;
    printf("Thread %d sees final value %d\n", which, val);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t< NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, SimpleThread, (void* )t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }

   /* Last thing that main() should do */
   pthread_exit(NULL);
}

そして、出たエラーはこれ。

test.c: 関数 'main' 内: test.c:28: warning: 引数 3 の渡す pthread_create' は互換性のないポインタ型からです。 /usr/include/pthread.h:227: note: 期待される 'void * (*) )(ボイド )' が 引数は 'void (*)(int)' 型です。

SimpleThread関数を変更することができないので、パラメータの型を変更することは、すでに試してみて、それもうまくいかなかったにもかかわらず、選択肢ではありません。

私は何を間違えているのでしょうか?

どうすればいいですか?

SimpleThread は、次のように宣言する必要があります。

void* SimpleThread(void *args) {
}

スレッドにパラメータを渡す場合、そのパラメータを定義するために struct へのポインタを渡し、その struct として void* で、関数内で正しい型にキャストバックします。