我想创建线程

int joueur=3;  // in my case it is in a "for" loop
jouer(joueur);

我用了这个语法
我试过这个:
int *joueur = malloc(sizeof(*joueur));
//if (joueur == NULL)
    //doNotStartTheThread_ProblemAllocatingMemory();
pthread_create(&threads[joueur], NULL, jouer, (int *) joueur);

jouer function

void jouer(int joueur)
 {
 while(but_trouve==0)
  {
  pthread_mutex_lock (&mutex);
  for(joueur=0;joueur<nombre_joueurs;joueur++) if(labyrinthe[joueur_ligne[joueur]][(joueur_colonne[joueur])%4]="b") but_trouve=1;
  if (but_trouve==1) break; // si un joueur a trouve le but on termine la partie
  deplacer(joueur);
//  pthread_cond_signal (&condition); /* On délivre le signal : condition remplie */
  pthread_mutex_unlock (&mutex);  // Fin de la zone protegee
  affiche();
  }
 pthread_exit(NULL);
 }

但我现在有这个信息。
 warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
  pthread_create(&threads[threads[nombre_joueurs]], NULL, jouer, (int *) joueur);
In file included from /home/nouha/test.c:4:0:
/usr/include/pthread.h:244:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(int)’
 extern int pthread_create (pthread_t *__restrict __newthread,

,谢谢你的阅读,

最佳答案

您正在传递变量的值,它需要地址。
您不能将joueur的地址作为数据参数传递给pthread_create(),因为它是一个局部变量,并且在函数返回时将被释放,这可能发生在线程完成工作之前。
我建议

int *joueur = malloc(sizeof(*joueur));
if (joueur == NULL)
    doNotStartTheThread_ProblemAllocatingMemory();
pthread_create(&threads[joueur], NULL, jouer, (void *) joueur);

注意,上面的joueur类型是int *,在您的示例中,它是int *您不能通过将它强制转换为pthread_create()来将其传递给void *函数,因为它被解释为一个地址,而且我怀疑3是否有效。
不要忘记在线程与poitner一起工作时释放joueur,因为您以前无法释放它,否则会发生相同的问题。

07-24 22:24