我想创建线程
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
,因为您以前无法释放它,否则会发生相同的问题。