Précédent   Forum des professionnels en informatique > C et C++ > C++ > Threads & Processus
Threads & Processus Forum d'entraide sur le multithreading et la programmation parallèle en C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 17h37   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 5
Points : 5
Par défaut debuter thread win32

bonjour le code suivant marche de façon indefinie 2 thread sont executé des fois 3 voir 4 rarement 5
et des fois j'ai des erreurs de segmentation

je debarque en programmation multi-tache
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <Windows.h>
#include <Winbase.h> 
DWORD WINAPI ThreadProc(LPVOID arg)
{    
   int *myNumber = (int*)arg;
   while(*myNumber < 2000)
		(*myNumber)++;
   ExitThread(NO_ERROR);
 
 return 0;
}
 
int main()
{
	SECURITY_ATTRIBUTES attr;
 
	int gogol[5]={8,6,3,1,4};
	HANDLE h[5]={0};
	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
    attr.lpSecurityDescriptor = NULL;  
    attr.bInheritHandle = 0;
	DWORD  dwExitCode[5] ={0};
 
	for(unsigned int i=0;i<5;++i)
	{
		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
	}
	miaw:
	for(unsigned int i=0;i<5;++i)
	{
		GetExitCodeThread(h[i], &dwExitCode[i]);
		if((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR))
			break;
		else
			goto miaw;
	}
 
}
les 5 threads accedent "normalement" a des données sans interdependance entre eux il ne devrait pas avoir besoin de mutex etc..
peut etre le problème est qu'il manque une fonction pour attendre les la fin des threads
merci de me corriger
Fifou625 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h57   #2
Invité régulier
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 5
Points : 5
a priori c'est resolu avec du code en carton ; il fallait bien attendre que les thread renvoie NO_ERROR
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <Windows.h>
#include <Winbase.h> 
DWORD WINAPI ThreadProc(LPVOID arg)
{    
   int *myNumber = (int*)arg;
   while(*myNumber < 2000)
		(*myNumber)++;
   ExitThread(NO_ERROR);
}
 
int main()
{
	SECURITY_ATTRIBUTES attr;
 
	int gogol[5]={8,6,3,1,4};
	HANDLE h[5]={0};
	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
    attr.lpSecurityDescriptor = NULL;  
    attr.bInheritHandle = 0;
	DWORD  dwExitCode[5] ={0};
 
	for(unsigned int i=0;i<5;++i)
	{
		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
	}
	miaw:
	for(unsigned int i=0;i<5;++i)
	{
		GetExitCodeThread(h[i], &dwExitCode[i]);
	}
	if(!((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR)))
		goto miaw;
}
si il ya un code plus intelligent (avec d'autre fonction que GetExitCodeThread() je suis preneur)
(osef de goto c'est ecris à la va vite , pareille pour la boucle)
Fifou625 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 18h05   #3
Expert Confirmé
 
nicolas
Développeur de jeux vidéo
Inscription : août 2007
Messages : 2 170
Détails du profil
Informations personnelles :
Nom : nicolas
Âge : 31
Localisation : Suède

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : Arts - Culture

Informations forums :
Inscription : août 2007
Messages : 2 170
Points : 3 825
Points : 3 825
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
screetch est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/02/2012, 18h09   #4
Invité régulier
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 5
Points : 5
merci
Fifou625 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 22h20   #5
Invité régulier
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 5
Points : 5
en gros ça donne ça
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <Windows.h>
#include <Winbase.h> 
#include <iostream>
DWORD WINAPI ThreadProc(LPVOID arg)
{    
   int *myNumber = (int*)arg;
   while(*myNumber < 2000)
		(*myNumber)++;
   ExitThread(NO_ERROR);
}
 
int main()
{
	SECURITY_ATTRIBUTES attr;
 
	int gogol[5]={8,6,3,1,4};
	HANDLE h[5]={0};
	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
    attr.lpSecurityDescriptor = NULL;  
    attr.bInheritHandle = 0;
	DWORD  dwExitCode[5] ={0};
 
	for(unsigned int i=0;i<5;++i)
	{
		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
	}
	/*
	miaw:
	for(unsigned int i=0;i<5;++i)
	{
		GetExitCodeThread(h[i], &dwExitCode[i]);
	}
	if(!((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR)))
		goto miaw;
		*/
	using namespace std;
	DWORD er=0;
 
	do
	{
 
		switch(er=WaitForMultipleObjects(5,h,TRUE,0))
		{
		case WAIT_OBJECT_0:
			cout << "WAIT_OBJECT_0" << endl;
			break;
		case WAIT_ABANDONED_0:
			cout << "WAIT_ABANDONED_0" << endl;
			break;
		case WAIT_TIMEOUT:
			cout << "WAIT_TIMEOUT" << endl;
			break;
		case WAIT_FAILED:
			cout << "WAIT_FAILED" << endl;
			break;
		default : //never happen
			break;
		}
	}while(er==WAIT_TIMEOUT);
}
Fifou625 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h41.


 
 
 
 
Partenaires

Hébergement Web