2012-11-27 2 views
1

Je crée la file d'attente lockless dans C \ C++, la file d'attente fonctionne bien, mais je reçois des erreurs, Visual Studio montre qu'il est un fonctionnement libre et aussi il se bloque sur cette fonctioncorruption du tas de Windows C++ C

extern « C » _CRTIMP int __cdecl _CrtIsValidHeapPointer ( vide const * pUserData)

Et cela se produit lorsque Thera sont beaucoup de fils de lecture (threads qui utilise libre), si je retire sans cela fonctionne très bien avec un certain nombre de fils ou si je mets simple printf ("truc aléatoire"); (Il ralentit obstinément un peu) cela fonctionne très bien avec un certain nombre de threads. Donc, je ne sais pas quoi faire :(il semble que beaucoup de threads tentent de libérer les fenêtres de mémoire ne peut pas gérer, est-ce le problème? Aussi, je reçois violation d'accès, lorsque l'adresse variable devient «magique» (0xABABABAB, 0xCDCDCDCD ..), je trouve que ceux-ci sont aussi liés à tas ..

Dans linux, avec des fils Posix n'a pas eu de problèmes, fonctionne très bien avec un certain nombre de fils.

Alors question , pourquoi ralentir les discussions aide (ou c'est une coïncidence?) et comment se débarrasser des problèmes de tas sans ralentir des conseils sur la mémoire de tas sont les bienvenus

Source:. queue.c queue.h

+3

On dirait que vous avez un problème de race, mais personne ne peut vous aider sans code – Collin

+0

Tant que vous utilisez juste un régulier, thread-safe tas de processus pour mettre en œuvre la file d'attente, ce n'est pas sans verrou. Utilisez-vous des atomiques pour l'accès variable? Les affectations de variables simples ne fonctionneront PAS dans les threads. Peu importe si cela fonctionne dans vos tests - il échouera sous une charge suffisante. – ActiveTrayPrntrTagDataStrDrvr

+0

Mis à jour avec le code. La file d'attente fonctionne bien mais avec une grosse charge, elle se bloque. Et plante toujours dans la méthode dequeue. –

Répondre

1

J'ai rencontré un problème similaire pendant que j'essayais d'invoquer un de mes DLL à partir d'un Mui GUI.

Vous risquez d'avoir ce genre de problème si vous avez créé un lien statique entre dll et dll/exe comme lien dynamique contre MSVC Runtime.

Il semble que la DLL liée statiquement contre MSVC Runtime s'exécute dans un contexte différent de la DLL liée dynamiquement à MSVC Runtime, même si elles sont utilisées dans la même application.

Fondamentalement, si vous libérez ou renvoyez un pointeur qui a été créé à partir de deux contextes différents, la corruption du tas s'est produite. Si vous déboguez le programme en VS, il ne montrera aucune erreur. Mais si vous l'exécutez, il affichera l'erreur de corruption de tas après avoir quitté le contexte de retour.

Une solution possible consiste à lier dynamiquement toute la DLL à MSVC Runtime.

Hope this helps,

ce qui a trait