Multithreading en c ++

Je veux exécuter une fonction avec différents parameters sur différents threads:

int threads = 3; int par1[] = {1, 2, 3}; int par2[] = {4, 5, 6}; for (int i=0; i<threads; i++){ //new_thread function(par1[i], par2[i]); } 

Je ne connais rien aux threads. J’ai essayé de faire quelque chose avec l’API Windows (je ne peux pas utiliser d’autres bibliothèques), mais cela ne fonctionne pas. Comment dois-je implémenter ceci? Et il est possible de démarrer un nombre inconnu de threads du temps de programmation (création dynamic de threads)?

Un exemple d’exemple pour Windows,

 #include  struct thread_data { int m_id; thread_data(int id) : m_id(id) {} }; DWORD WINAPI thread_func(LPVOID lpParameter) { thread_data *td = (thread_data*)lpParameter; cout << "thread with id = " << td->m_id << endl; return 0; } int main() { for (int i=0; i< 10; i++) { CreateThread(NULL, 0, thread_func, new thread_data(i) , 0, 0); } } 

Dans cet exemple, chaque thread obtient des données différentes, à savoir de type thread_data , qui sont transmises en tant qu'argument à la fonction de thread thread_func() .

Lisez-les pour savoir comment créer un thread sur Windows:

http://msdn.microsoft.com/en-us/library/ms682516(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms682453(v=vs.85).aspx


Aussi, vous aimerez peut-être aussi cette suggestion:

Meilleur design: définissez une classe réutilisable!

Je ne connais rien aux threads.

C’est un problème. Threads est l’un des domaines où des expériences sans au moins quelques connaissances théoriques aboutissent généralement à une catastrophe. Il y a tellement de choses qui peuvent mal se passer avec le threading, mais cela ne se produit que très tard.

Je suggérerais soit de vous procurer un livre sur le multithreading ou de lire quelques articles en ligne avant de commencer.

Si vous êtes intéressé par l’utilisation du multithreading pour plus d’efficacité, la colonne de Herb Sutter peut être faite pour vous. Et puis il y a l’excellent Introduction à l’informatique parallèle de Blaise Barney.

Vous devez faire plusieurs choses pour que cela fonctionne. Tout d’abord, la fonction thread Windows prend cette signature:

 DWORD WINAPI ThreadFunction(LPVOID args) 

La routine de démarrage du thread est cette fonction:

 HANDLE WINAPI CreateThread( __in_opt LPSECURITY_ATTRIBUTES lpThreadAtsortingbutes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags, __out_opt LPDWORD lpThreadId ); 

Notez que la manière de passer des arguments à votre fonction de thread est via un LPVOID. Cela signifie que vous devez créer une structure pour contenir vos par1 et par2 . Vous devez ensuite passer un pointeur sur cette structure et extraire le contenu de votre routine de thread.

Puisque OpenMP est pris en charge dans Visual studio, pourquoi ne pas l’utiliser? C’est beaucoup plus simple que de gérer vos propres threads manuellement, c’est très portable et l’exemple que vous avez donné est presque parfait pour cela. Wikipedia a une introduction raisonnable aux concepts d’OpenMP .

Dans votre exemple, le code simple (et légèrement naïf – normalement, vous ne dites pas explicitement le nombre de threads, vous dites le nombre d’unités de travail) est le suivant:

 int threads = 3; int par1[] = {1, 2, 3}; int par2[] = {4, 5, 6}; #pragma omp parallel for for (int i=0; i 

Avec une option appropriée transmise au compilateur pour activer OpenMP. Sans cette option, il est toujours compilé et exécuté en tant que programme série.

Puis-je suggérer l’utilisation de boost :: thread_group ?

 boost::thread_group g; int threads = 3; int par1[] = {1, 2, 3}; int par2[] = {4, 5, 6}; for (int i=0; i 

Vous créez un thread dans Windows en appelant CreateThread . Il y a un exemple ici .

Oui, vous pouvez créer dynamicment des threads.

Désormais, lorsque votre “fonction de fil” est appelée (ce qui signifie que le fil a commencé), vous utilisez le paramètre transmis que vous avez indiqué lors de l’appel de CreateThread.
Au “thread-function” c’est “LPVOID lpParam”. Vous devriez le jeter à votre type. Si vous devez transmettre deux objects au thread, créez votre propre structure / classe personnalisée avec les membres appropriés et transmettez-en une instance lorsque vous appelez CreateThread afin de pouvoir l’utiliser ultérieurement. Très simple.