我想创建线程
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,
,谢谢你的阅读,
答案 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);
}