1

[nosmile]Quelqu'un aurait une idée de la raison qui explique pourquoi le petit bout de code ci-dessous plante ? Après avoir parcouru MSDN je n'ai pas l'impression de faire des trucs illégaux avec CreateThread & co, pourtant j'ai des plantages (comme ça) à peu près une fois sur 10. Si j'ajoute un "Sleep (10);" entre les appels à ResumeThread, plus rien ne plante. Il y a une limitation quelque part ?
Source
#include <iostream>
#include <map>
#include <windows.h>

struct	MyException
{
};

static DWORD WINAPI	MyCallback (LPVOID)
{
	try
	{
		throw MyException ();
	}
	catch (MyException& e)
	{
	}

	return 0;
}

int	main()
{
	const int		count = 100;
	std::map<int, HANDLE>	threads;
	DWORD			id;

	std::cout << "CREATE THREADS" << std::endl;

	for (int i = 0; i < count; ++i)
		threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id);

	std::cout << "START THREADS" << std::endl;

	for (int i = 0; i < count; ++i)
		ResumeThread (threads[i]);

	Sleep (1000);

	return 0;
}
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Je viens de lire que pour utiliser des exceptions dans des threads quand on utilise MinGW (c'est mon cas) il fallait compiler avec "-mthreads", mais je continue à avoir pas mal de soucis (et si j'ai la mauvaise idée d'afficher quelque chose depuis l'un des threads avec iostream, c'est un plantage à tous les coups ; je pensais pourtant que la STL était thread-safe ?)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

comment dire... chez moi ton code tel que posté fonctionne bien.

et le même code qui fait un std::cout << "Hello" << std::endl; a la place du trycatch fonctionne très bien aussi, par contre tout ce que je peux dire c'est que les appels à cout .


ah c'est marrant le premier coup ça a marché mais maintenant quand je recompile le premier ça me met le même message que toi confus

en fait, ça marche mais pas à tous les coups.

SLO@SLO-PC1 ~
$ g++ test.cpp

SLO@SLO-PC1 ~
$ ./a.exe 
CREATE THREADS
START THREADS

SLO@SLO-PC1 ~
$ cp test.cpp test2.cpp

SLO@SLO-PC1 ~
$ notepad test2.cpp

SLO@SLO-PC1 ~
$ cat test.cpp
#include <iostream> 
#include <map> 
#include <windows.h> 
 
struct  MyException 
{ 
}; 
 
static DWORD WINAPI     MyCallback (LPVOID) 
{ 
        try 
        { 
                throw MyException (); 
        } 
        catch (MyException& e) 
        { 
        } 
 
        return 0; 
} 
 
int     main() 
{ 
        const int               count = 100; 
        std::map<int, HANDLE>   threads; 
        DWORD                   id; 
 
        std::cout << "CREATE THREADS" << std::endl; 
 
        for (int i = 0; i < count; ++i) 
                threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id); 
 
        std::cout << "START THREADS" << std::endl; 
 
        for (int i = 0; i < count; ++i) 
                ResumeThread (threads[i]); 
 
        Sleep (1000); 
 
        return 0; 
}

SLO@SLO-PC1 ~
$ g++ test.cpp

SLO@SLO-PC1 ~
$ ./a.exe 
CREATE THREADS
START THREADS

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

SLO@SLO-PC1 ~
$ ./a.exe 
CREATE THREADS
START THREADS

SLO@SLO-PC1 ~
$ cat test2.cpp
#include <iostream> 
#include <map> 
#include <windows.h> 
 
struct  MyException 
{ 
}; 
 
static DWORD WINAPI     MyCallback (LPVOID) 
{ 
        std::cout << "Hello" << std::endl;
        return 0; 
} 
 
int     main() 
{ 
        const int               count = 100; 
        std::map<int, HANDLE>   threads; 
        DWORD                   id; 
 
        std::cout << "CREATE THREADS" << std::endl; 
 
        for (int i = 0; i < count; ++i) 
                threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id); 
 
        std::cout << "START THREADS" << std::endl; 
 
        for (int i = 0; i < count; ++i) 
                ResumeThread (threads[i]); 
 
        Sleep (1000); 
 
        return 0; 
}

SLO@SLO-PC1 ~
$ g++ test2.cpp

SLO@SLO-PC1 ~
$ ./a.exe 
CREATE THREADS
START THREADS
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
HelloHelloHelloHelloHelloHello




Hello
Hello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello



Hello




Hello












Hello
Hello

Hello


HelloHelloHelloHelloHelloHelloHelloHelloHello
Hello
Hello
HelloHello
Hello
Hello





HelloHello
























Hello


Hello







HelloHelloHelloHello



Hello

SLO@SLO-PC1 ~



edit: après réflexion, je pense que le message d'erreur vient du fait que main() se termine alors qu'au moins un thread créé n'est pas terminé, du coup ça se finit "salement". C'est cohérent avec le pasplantage quand tu mets des petits sleep() qui permettent à chaque thread de se finir avant la fin du sleep, du coup à la fin de main ils sont tous terminés, ce qui n'est pas forcément le cas sans eux. 1 seconde de pause ça parait long, mais 100 threads en très peu de temps c'est sans doute un peu stressant pour le noyau grin

Je connais pas l'api win32 équivalente à pthread_join, qui attend qu'un thread soit terminé... ça aiderait, ptet, chais pas.

4

nop, j'ai testé avec un Sleep beaucoup plus long et le problème est le même ; de plus il se produit pendant la boucle qui appelle les "ResumeThread" et pas après, donc le Sleep () final n'intervient pas (je l'ai juste ajouté pour ne pas que le programme se termine alors que les threads n'ont même pas encore démarré)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

j'avoue que c'est étonnant. Faudrait un débugger sérieux pour tracer la vie des threads.

rien du coté de l'équivalent de pthread_join?

moi ce qui m'étonne c'est le coté "des fois ça marche mais pas tout le temps"

6

Pour attendre que tous les threads se soient terminés, c'est WaitForMultipleObjects() : exemple ici.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

Aussi, tu ne devrais pas utiliser directement CreateThread() si tu utilises un mécanisme dépendant de la CRT, comme les exceptions.

Je te conseillerais d'utiliser _beginthreadex() (note le -ex) à la place.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

8

Hmmm...
[kevin@localhost ~]$ cat >test.cpp <<EOF
> #include <iostream>                   
> #include <map>                        
> #include <windows.h>                  
>                                       
> struct  MyException                   
> {                                     
> };                                    
>                                       
> static DWORD WINAPI     MyCallback (LPVOID) 
> {                                           
>         try                                 
>         {                                   
>                 throw MyException ();       
>         }                                   
>         catch (MyException& e)              
>         {                                   
>         }                                   
>                                             
>         return 0;                           
> }                                           
>                                             
> int     main()                              
> {                                           
>         const int               count = 100; 
>         std::map<int, HANDLE>   threads;     
>         DWORD                   id;          
>                                              
>         std::cout << "CREATE THREADS" << std::endl; 
>                                                     
>         for (int i = 0; i < count; ++i)             
>                 threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id);                                                                   
>                                                                               
>         std::cout << "START THREADS" << std::endl;                            
>                                                                               
>         for (int i = 0; i < count; ++i)                                       
>                 ResumeThread (threads[i]);                                    
>                                                                               
>         Sleep (1000);                                                         
>                                                                               
>         return 0;                                                             
> }
> EOF
[kevin@localhost ~]$ i386-mingw32-g++ -Os -s test.cpp -o test.exe
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ wine test.exe
CREATE THREADS
START THREADS
[kevin@localhost ~]$ uname -r
2.6.27.21-78.2.41.fc9.i686
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Et le test de squalyl...
[kevin@localhost ~]$ cat >test.cpp <<EOF
> #include <iostream>                   
> #include <map>                        
> #include <windows.h>                  
>                                       
> struct  MyException                   
> {                                     
> };                                    
>                                       
> static DWORD WINAPI     MyCallback (LPVOID)  
> {                                            
>         std::cout << "Hello" << std::endl;   
>         return 0;                            
> }                                            
>                                              
> int     main()                               
> {                                            
>         const int               count = 100;  
>         std::map<int, HANDLE>   threads;      
>         DWORD                   id;           
>                                               
>         std::cout << "CREATE THREADS" << std::endl;  
>                                                      
>         for (int i = 0; i < count; ++i)              
>                 threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id);                                                                   
>                                                                               
>         std::cout << "START THREADS" << std::endl;                            
>                                                                               
>         for (int i = 0; i < count; ++i)                                       
>                 ResumeThread (threads[i]);                                    
>                                                                               
>         Sleep (1000);                                                         
>                                                                               
>         return 0;                                                             
> }
> EOF
[kevin@localhost ~]$ i386-mingw32-g++ -Os -s test.cpp -o test.exe
[kevin@localhost ~]$ wine test.exe
CREATE THREADS                    
START THREADS                     
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
[kevin@localhost ~]$ wine test.exe
CREATE THREADS                    
START THREADS                     
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
[kevin@localhost ~]$ wine test.exe
CREATE THREADS                    
START THREADS                     
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
[kevin@localhost ~]$ wine test.exe
CREATE THREADS                    
START THREADS                     
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
[kevin@localhost ~]$ wine test.exe
CREATE THREADS                    
START THREADS                     
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello                             
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

./8, ./9 : "chez moi ça marche" ? c'est cool mais chez moi ça plante :/ (dernière version de Code::Blocks : 8.2, gcc 4.2.1)

./7 : c'est quoi ces fonctions _beginthreadex & co (le fait qu'elles commencent par un underscore laisse penser qu'elles ne sont pas recommandées) ? de plus je lis sur msdn que "the handle returned by _beginthreadex has to be closed by the caller of _beginthreadex", ce qui est une sacré contrainte :/ (et impossible à respecter dans mon cas)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

11

je viens de voir que j'ai compilé avec gcc 3.4.5 installé par mingw-installer, et pas gcc 4.2.1 . C'est peut être ça la différence. Je vais refaire le test avec gcc 4. Je suppose que c'est celui qui est packagé avec code blocks? (edit: ah non)

Ta version de mingw est elle imposée? J'ai déja vu des trucs qui demandaient gcc 3.X pour se compiler.

Je te conseillerais le test, pour confirmer que c'est un problème de gcc 4/mingw.

edit: d'ailleurs tu l'as trouvé ou, gcc 4.1 pour mingw? sur leur site, y'a gcc 4.3 en testing alpha (donc pas stable) et codeblocks est livré avec gcc 3.4.5 !

12

ah effectivement, la boite "About" affiche GCC 4 (screenshot) mais avec "gcc -v" on vérifie effectivement que c'est la version 3.4.5...

ceci dit j'aimerais plutôt avoir un début d'explication plutôt que faire des tests au petit bonheur la chance en espérant que ça règle le problème :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

Je pencherais pour une débordement de pile (ou mémoire) qui n'interviens pas a chaque fois (je vais tester avec Visual Studio pour voir)

Et je viens de voir que pendant l'execution l'appli et pas eu de plantage encore

edit: resultat avec le test de squalyl:
result
C:\Documents and Settings\mtrapier\Mes documents\Visual Studio 2005\Projects\Bob
Test\debug>BobTest.exe
CREATE THREADS
START THREADS
HelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello



































































































C:\Documents and Settings\mtrapier\Mes documents\Visual Studio 2005\Projects\Bob
Test\debug>BobTest.exe
CREATE THREADS
START THREADS
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHello
HelloHelloHelloHello
HelloHello
HelloHelloHelloHelloHello
HelloHelloHello
HelloHelloHello
HelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHello
HelloHelloHello
HelloHelloHelloHelloHello
HelloHelloHello
HelloHelloHelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHello
















































































C:\Documents and Settings\mtrapier\Mes documents\Visual Studio 2005\Projects\Bob Test\debug>


Je pencherais effectivement peut-être pour une bug dans gcc ou dans le Runtime (qui n'est apriori pas celui de Microsoft)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

14

Hmm pourtant j'ai déjà eu le problème avec 10 threads, c'est plus rare mais ça reste possible. J'espère qu'avec 10 threads c'est pas une limitation de la mémoire quand même :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

15

Tu veux tester avec l'executable que j'ai généré ?

(dans le doute tromb Fichier joint : BobTest.exe )
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

16

Il ne se lance pas chez moi ; mais bon ça m'intéresse assez moyennement en fait, qu'il marche ou pas ça ne m'apportera aucune explication sur le problème ^^

Sinon je viens de tester avec _beginthreadex et _endthreadex et ça plante toujours. Peut-être un peu plus difficilement mais c'est difficile à quantifier, je suis parfois obligé de lancer le programme plus de 10 fois pour le voir planter.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

17

Zephyr (./16) :
Il ne se lance pas chez moi ; mais bon ça m'intéresse assez moyennement en fait, qu'il marche ou pas ça ne m'apportera aucune explication sur le problème ^^


Ca peut juste permetre de discriminer un problème OS/Hard plutot que le code en lui meme, enfin meme si le problème soft a plus de chance d'etre la raison
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

18

_beginthreadex(), c'est la même chose que CreateThread(), sauf que les fonctions d'initialisation de la CRT sont appelées au début du nouveau thread. La doc de CreateThread elle-même déconseille CreateThread() au profit de _beginthreadex().

Le passage que tu as cité veut juste dire "ne pas oublier de fermer le handle": Il s'agit en réalité du même handle retourné par CreateThread() (casté en intptr_t), tu le fermes quand tu veux.

L'autre particularité, c'est que le type de retour de ta fonction doit être UINT au lieu de DWORD si tu veux que ça compile sans cast sur le pointeur de fonction.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

19

ok, merci pour les explications, même si comme dit plus haut ça ne règle pas le pb :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

20

Est-ce que tu as testé avec un bete tableau ?

ie:

#include <iostream>  
#include <map>  
#include <windows.h>  
  
struct  MyException  
{  
};  
  
static DWORD WINAPI     MyCallback (LPVOID)  
{  
        try  
        {  
                throw MyException ();  
        }  
        catch (MyException& e)  
        {  
        }  
  
        return 0;  
}  
  
int     main()  
{  
        const int               count = 100;  
        //std::map<int, HANDLE>   threads;  
	HANDLE                  threads[100];  
        DWORD                   id;  
  
        std::cout << "CREATE THREADS" << std::endl;  
  
        for (int i = 0; i < count; ++i)  
                threads[i] = CreateThread (NULL, 0, &MyCallback, 0, CREATE_SUSPENDED, &id);  
  
        std::cout << "START THREADS" << std::endl;  
  
        for (int i = 0; i < count; ++i)  
                ResumeThread (threads[i]);  
  
        Sleep (1000);  
  
        return 0;  
} 


Voir de mettre 'NULL' a la place du '&id'
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

21

Toujours pareil, plantage au bout d'un temps variable (avec CreateThread comme avec _beginthreadex) cry

Pour reproduire plus facilement le problème j'utilise ce code qui exécute 10 fois la procédure "créer 100 threads, démarrer les 100 threads, attendre la fin et fermer les handles". Chez moi ça plante presque à chaque fois avant la 10ième itération, quel que soit l'api que j'utilise (il suffit d'interchanger les deux #define des lignes 6 et 7 pour passer d'une API à l'autre).

Si je vire le "throw", plus aucun plantage.

Vous arrivez à reproduire le bug cette fois ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

22

Le problème semble bien venir de la chaine de compilation et/ou le runtime associé, avec VS 2005 aucun plantage apres une dizaine d'executions :/
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

23

peut-être, mais je n'ai pas VS et je cherche à avoir quelque chose qui compile avec GCC (pour compiler également sous Unix plus tard) donc le fait que ça marche sous VS ne m'aide pas beaucoup :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

24

Le GCC utilisé dans mes tests, c'est i386-mingw32-g++ (GCC) 4.2.1-sjlj (mingw32-2).

Étant donné que ça ne foire pas avec WINE, je pense qu'il est clair d'où vient le problème, même si ça ne va pas t'arranger parce que tu ne peux pas le corriger.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

25

26

Kevin Kofler : peut-être aussi que WINE ne reproduit pas exactement le comportement de Windows et qu'il évite ainsi de tomber sur le bug provoqué par mes tests ? (simple supposition, je ne sais pas comment fonctionne WINE)

Sinon quand tu dis "je pense qu'il est clair d'où vient le problème", tu parles de MinGW ? Parceque si ça n'est que ça, je peux toujours essayer de le changer, même si j'ai du mal à saisir pourquoi le compilateur déclencherait un bug seulement avec certains appels système particuliers, en l'occurrence les threads (ou alors c'est un sacré bug qui doit se retrouver dans d'autres situations ?).

[edit] ah j'étais passé au-dessus d'un détail gênant : mingw n'en est qu'à GCC 3.4.5... donc en gros GCC sous Windows n'existe plus, c'est VS ou rien... super :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

27

non, mingw a une version de gcc 4.3 si tu veux tester.
http://sourceforge.net/project/showfiles.php?group_id=2435

suffit de l'installer avec mingw-installer puis de changer le dossier dans lequel codeblocks cherche gcc.

28

Zephyr (./26) :
Sinon quand tu dis "je pense qu'il est clair d'où vient le problème", tu parles de MinGW ?

il parle de windows. Un appel systême ou une lib est codée correctement sous wine, mais pas sous windows...

29

Peut-être, mais les threads buggés sous Windows j'ai quand même un peu de mal à y croire... c'est pas comme si c'était une fonctionnalité rarement utilisée, si il y avait des bugs système aussi graves je serais pas le seul à être tombé dessus.

squalyl : ok mci
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

30

Bon je viens de télécharger Visual Studio C++ Express pour tester :

- Plus de plantage, j'ai testé 100 boucles de 100 threads et ça termine sans planter
- Mais à la fin de l'exécution, VS m'affiche le message : "Run-Time Check Failure #2 - Stack around the variable 'threads' was corrupted.", donc il y a quand même un soucis quelque part (même si je ne sais pas où)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)