0

関数内の配列にアクセスできるように、配列をスレッド関数に渡そうとしています。今のところ、スレッドの名前だけが含まれています。

const char *a[2];
char *s = "Thread 1";
char *r = "Thread 2";
a[0] = s;
a[1] = r;
pthread_create(&t, NULL, oddhandler, (void *)a[0]);
pthread_create(&y, NULL, evenhandler, (void *)a[1]);

意図は、このように作成することです

pthread_create(&t, NULL, oddhandler, &a);
pthread_create(&y, NULL, evenhandler, &a);

この変更に対応するには、この関数をどのように書き直せばよいでしょうか?

static void *
oddhandler(void *p)
{
    char *q = (char *)p;
    printf("%s is ready.\n", q);
    sigset_t set;
    int sig = SIGUSR1;

    sigemptyset(&set);

    sigaddset(&set, SIGUSR1);

    while (1) {

       /* Wait for SIGUSR1 */
       sigwait(&set, &sig);

       printf("%s received a SIGUSR1!\n", q);

    }

    return ((void *)NULL);
}
4

1 に答える 1

0

スレッド ID とスレッド データを結合してみることができます。

typedef struct thread_info {
  int thread_id; // different for every thread
  void * thread_data; // the same for every thread
}

サンプル プログラムのように、1 つの関数ハンドラーを作成し、ID に基づいてスレッドを調整することができます。

pthread_create(&(t[id], NULL, handler, &(info[i]));

void * handler(void * info) {
   thread_info * myInfo = (thread_info *) info;
   char *q = ((char *) myInfo->thread_data) + myInfo->thread_id;

   // rest of function
}
于 2012-11-01T20:41:49.407 に答える