7

私はスレッドを作成しようとしていますが、私が覚えていることから、これはそれを行う正しい方法であるはずです。

#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:警告:互換性のないポインター型/usr/include/pthread.h:227から'pthread_create'の引数3を渡します:注:予期される' void *(* )( void *)'ですが、引数のタイプは' void(*)(int)'</ p>

SimpleThread関数を変更できないので、パラメーターのタイプを変更することは、すでに試したが機能しなかったとしても、オプションではありません。

私は何が間違っているのですか?

4

2 に答える 2

17

SimpleThreadとして宣言する必要があります

void* SimpleThread(void *args) {
}

スレッドにパラメーターを渡すときはstruct、それらに対して を定義し、それへのポインターをstructとして渡しvoid*、関数内で正しい型にキャストするのが最善です。

于 2012-06-28T21:18:53.297 に答える
4

これはあなたのプログラムのコンパイル済みで「動作する」バージョンですが、それが何をしているのか正確にはわからないことを認めざるを得ません。聴衆の批評家のためにpthread_join、最後にループがあることを前もってお詫びします。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define NUM_THREADS 5

struct my_thread_info {
    long which;
};

int SharedVariable = 0;

void *SimpleThread(void *data)
{
    int num, val;
    struct my_thread_info *info = data;

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

    val = SharedVariable;
    printf("Thread %ld sees final value %d\n", info->which, val);

    free(info);
    return NULL;
}

int main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int rc;
    long t;
    struct my_thread_info *info;
    for (t = 0; t < NUM_THREADS; t++) {
        printf("In main: creating thread %ld\n", t);

        info = malloc(sizeof(struct my_thread_info));
        info->which = t;

        rc = pthread_create(&threads[t], NULL, SimpleThread, info);
        if (rc) {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    for (t = 0; t < NUM_THREADS; t++) {
        pthread_join(threads[t], NULL);
    }
}
于 2012-06-28T21:18:50.757 に答える