code:Augmentez le filetage/les mutex, pourquoi cela fonctionne-t-il?
#include <iostream>
#include "stdafx.h"
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
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 10 12 14 16 18 Press any key to continue . . .
... Alors ma question est pourquoi cela fonctionne (pour autant que je peux dire, je l'ai couru environ 20 fois), la production de ce qui précède sortie, même avec le verrouillage commenté? Je pensais que l'idée générale était:
in each thread: calculate 2*x copy results to CPU register(s) store calculation in correct part of array copy results back to main(shared) memory
Je pense que dans toutes les conditions, mais parfait, cela aurait pour résultat une partie de la matrice de résultats ayant 0 valeurs. Copie-t-il seulement le double requis du tableau dans un registre cpu? Ou est-ce juste trop court d'un calcul pour être préempté avant d'écrire le résultat en RAM? Merci.
@Flamewires: Les structures de données compliquées sont correctes tant que chaque thread n'agit que sur sa propre structure (comme dans le tableau). Si vous retournez des bits sur un nombre entier, vous devrez soit verrouiller, soit vous assurer que vous avez une lecture atomique et un ensemble. Dans ce cas simple, cela forcerait tout le thread à fonctionner en série avec une forte contention pour le verrou, ce qui en ferait un très mauvais candidat pour la parallélisation. –
Oui, si vous avez remplacé le double par un autre type, ça irait toujours bien. Il n'y a pas de taille minimale en ce qui concerne le C++ 0x (il appartient à l'implémentation de faire ce travail sur toutes les plateformes). Si vous commencez à jouer avec des bits, vous obtenez une course de données (et donc un comportement indéfini), car vous accèderiez au même objet à partir de plusieurs threads sans synchronisation. – avakar
Ah d'accord, ça aide un peu. – Flamewires