用c语言

时间:2015-05-30 21:41:54

标签: c multithreading

我想创建线程

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,

,谢谢你的阅读,

2 个答案:

答案 0 :(得分:2)

您传递的是变量的值,它需要地址。

您不能将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因为它被解释为地址,我怀疑joueur是否有效。

当线程与poitner一起使用时,不要忘记释放{{1}},因为你之前无法释放它或者会出现同样的问题。

答案 1 :(得分:0)

这是正确答案:

void *jouer(void *arg);
int joueur=0;

for(joueur=0;joueur<nombre_joueurs;joueur++)
        {

        affiche();
        int *joueur = malloc(sizeof(*joueur));
        pthread_create(&threads[threads[nombre_joueurs]], NULL, jouer, (int *) joueur); 
        }