2010-11-08 3 views
1

J'écris un programme pthread maintenant. D'après ce que j'ai expérimenté en C#, je pense qu'il pourrait y avoir une condition de concurrence dans la création d'un fil de discussion.Existe-t-il une condition de concurrence potentielle dans pthread_create()?

for (i = 0; i < 10; i++) 
{ 
    pthread_create(threads[i], NULL, &do_something, (void*)&data[i]); 
} 

Est-il possible que la variable locale i soit mise à jour avant la création du nouveau thread? Par conséquent, l'entrée de données ou de threads incorrecte dans les tableaux peut être transmise à la fonction do_something? Au moins en C# si j'utilise Task.Factory.StartNew(), c'est un gros problème.

Merci d'avance.

Répondre

3

Une fois que pthread_create retourne tout ce qui est passé par la valeur aura été copié avec succès, en fait l'utilisation de i est évaluée avant même d'entrer dans la fonction pthread_create. Le pointeur lui-même est passé ici par valeur pour l'argument void *.

La possibilité de créer une condition de concurrence existe par exemple si vous transmettiez i lui-même par référence (ou pointeur) et que vous l'utilisiez pour accéder à un tableau dans la routine de démarrage. Ce n'est clairement pas le cas dans cet exemple.

+0

C'était ma conception initiale: passez directement. Puis j'ai réalisé le problème. Mais je n'étais pas sûr de la question que j'ai posée. Merci beaucoup. – LLS

+0

Tant que les threads et les données (s'il est même utilisé) survivent aux threads eux-mêmes, tout va bien. – Flexo

Questions connexes