C中的POSIX线程

Ště*_*ler 2 c posix pthreads

我试图了解线程的工作原理.我有一些学校的例子.在这一个我必须弄清楚为什么这段代码不能正常工作.它的输出是这样的:

Main: Creating thread 0
Main: Creating thread 1
Main: Creating thread 2
Main: Creating thread 3
Main: Creating thread 4
Main: Creating thread 5
Main: Creating thread 6
Main: Creating thread 7
Main: Creating thread 8
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Run Code Online (Sandbox Code Playgroud)

但每个帖子都应该用不同的语言说'Hello World'.这是我的代码.当函数中的第四个参数pthread_create只是(void *) t指针而不是指针时,它工作正常.但我知道正确的解决方案是(void *) &t.可能我正在处理一些指针问题,但我只是看不到...

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

#define NUM_THREADS 8

char *messages[NUM_THREADS + 1] = 
{
   "English: Hello World!",
   "French: Bonjour, le monde!",
   "Spanish: Hola al mundo",
   "Klingon: Nuq neH!",
   "German: Guten Tag, Welt!",
   "Russian: Zdravstvytye, mir!",
   "Japan: Sekai e konnichiwa!",
   "Latin: Orbis, te saluto!",
   "Cesky: Ahoj svete!"
};


void * helloThread ( void * threadid )
{
   int *id_ptr, taskid;

   sleep(1);
   id_ptr = (int *) threadid;
   taskid = *id_ptr;
   printf("Thread %d: %s\n", taskid, messages[taskid]);
   return(NULL);
}

int main(int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc, t;

   for(t=0;t<=NUM_THREADS;t++) {
      printf("Main: Creating thread %d\n", t);
      rc = pthread_create(&threads[t], NULL, helloThread, (void *) &t );
      if (rc) {
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         return (EXIT_FAILURE);
      }
  }

   pthread_exit(NULL);
   return ( 0 );
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 6

有几件事是错的:

首先,你是超越界限; 循环应该说for(t = 0; t < NUM_THREADS; t++).

其次,你必须在结束进程之前加入或分离线程,所以最后这样说:

for(t = 0; t < NUM_THREADS; ++t) {
   pthread_join(threads[t], NULL);
}
Run Code Online (Sandbox Code Playgroud)

第三,您将相同的指针(即&t)传递给所有线程.这不仅会给你错误的行为,而且还会因为竞争条件或解除引用悬挂指针而使你暴露于未定义的行为.相反,给每个线程自己的内存:

int q[NUM_THREADS];  /* dedicated storage for each thread! */

for(t = 0; t < NUM_THREADS; ++t) {
   printf("Main: Creating thread %d\n", t);
   q[t] = t;
   rc = pthread_create(threads + t, NULL, helloThread, q + t);
   /* ... */
}
Run Code Online (Sandbox Code Playgroud)

(第四,你不应该pthread_exit以你的方式调用终止主线程.这是不必要的,它阻止你main()以通常的方式返回.)