1

pthread_create(&Thread,NULL,ChildThread,(void *)100);

1) 上記のように pthread_create の 4 番目の引数を渡すことはできますか? ポインター変数ではないでしょうか?

4

3 に答える 3

2

ほんの一例 ( not meant to be correct way of doing it; but to serve as example code for anyone who want to play with it):

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <pthread.h>

void *print_number(void *number) {
    printf("Thread received parameter with value: %d\n", number);
    return (void *)number;
}

int main(int argc, char *argv[]) {
    pthread_t thread;
    void *ret;
    int pt_stat;
    pt_stat = pthread_create(&thread, NULL, print_number, (void *)100);
    if (pt_stat) {
        printf("Error creating thread\n");
        exit(0);
    }

    pthread_join(thread, &ret);
    printf("Return value: %d\n", ret);

    pthread_exit(NULL);

    return 0;
}

ポインター値が int が保持できる値よりも大きい場合、これは未定義の動作につながります。C99 からのこの引用を参照してください。

Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

于 2013-07-18T01:16:49.453 に答える
0

POSIX Thread Progreammingに関する優れた記事から引用。初心者は必ず読んでください。

Example Code - Pthread Creation and Termination

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

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

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, PrintHello, (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);
}

説明 :

の 4 番目の引数として 100 を渡すことができますpthread_create()。関数 PrintHello では、void* を型キャストして正しい型に戻すことができます。

于 2013-07-18T02:00:56.400 に答える