Boost threading / mutexs, pourquoi ça marche?

Code:

#include  #include "stdafx.h" #include  #include  using namespace std; boost::mutex mut; double results[10]; void doubler(int x) { //boost::mutex::scoped_lock lck(mut); results[x] = x*2; } int _tmain(int argc, _TCHAR* argv[]) { boost::thread_group thds; for (int x = 10; x>0; x--) { boost::thread *Thread = new boost::thread(&doubler, x); thds.add_thread(Thread); } thds.join_all(); for (int x = 0; x<10; x++) { cout << results[x] << endl; } return 0; } 

Sortie:

  0
 2
 4
 6
 8
 dix
 12
 14
 16
 18
 Appuyez sur n'importe quelle touche pour continuer .  .  .

Donc … ma question est pourquoi cela fonctionne-t-il (pour autant que je sache, je l’ai exécuté environ 20 fois), produisant la sortie ci-dessus, même avec le locking commenté? Je pensais que l’idée générale était:

 dans chaque fil:
 calculer 2 * x
 copier les résultats dans le (s) registre (s) de la CPU
 stocker le calcul dans la partie correcte du tableau
 copier les résultats dans la mémoire principale (partagée)

Je pense que dans des conditions presque parfaites, une partie du tableau de résultats aurait une valeur 0. Copie-t-il uniquement le double requirejs du tableau dans un registre cpu? Ou est-ce simplement trop court d’un calcul pour être préempté avant d’écrire le résultat dans bélier? Merci.

L’affectation a une lvalue de type double à gauche et est le seul object accessible par un thread. Puisque chaque thread accède à un object différent, il n’y a pas de course de données.

Notez que la souscription d’un tableau ne constitue pas un access.

Cela fonctionne à cause de la thds.join_all(); ligne. Le thread d’exécution principal s’interrompt ici jusqu’à ce que tous les autres threads soient terminés, puis continue d’imprimer le tableau. Par conséquent, vous savez que toutes les valeurs de tableau ont été stockées avant de les imprimer. Si vous commentez cette ligne, vous obtiendrez des résultats imprévisibles.