Je suis un débutant pour. Net et en essayant d'utiliser le filetage géré. Je n'ai trouvé aucun problème dans mon code, mais il déclenche une exception lorsque le thread se termine. Quelque chose comme: Exception non gérée à 0x5cbf80ea (msvcr90d.dll) 0xC0000005: violation d'accès en lecture l'emplacement 0x000000d7.Passer un tableau non géré à un thread géré. - corruption de mémoire
#include "stdafx.h"
using namespace System;
using namespace System::Threading;
#define sz 100
//int dt[sz]; //allcating a gloal buffer
int *dt;
void workerThread (void)
{
Console::WriteLine("Producer Thread Started!");
int data = 50;
for(int i=0; i<sz; i++)
{
Thread::Sleep(1);
dt[i] = i;
Console::WriteLine("Producer W={0}", i);
};
Console::WriteLine("Producer Thread Ending");
}
int main(array<System::String ^> ^args)
{
Console::WriteLine("This is a test on global variable and threading");
//allcating a buffer
dt = new int(sz);
Thread ^wthrd = gcnew Thread(gcnew ThreadStart(&workerThread));
//Starting Worker Thread..
wthrd->Start();
//Waiting for Worker Thread to end.
wthrd->Join();
Console::WriteLine("Worker Thread Ended.");
Console::ReadKey();
return 0;
}
Cependant, cela fonctionne correctement lorsque j'alloue le tampon en tant que tableau global. Cette exception intervient lorsque j'utilise un mot clé "new", d'où une allocation de mémoire dynamique. Est-ce que je fais des erreurs fondamentales? Est-ce quelque chose à traiter avec le garbage collector? ou Tas non géré alloué par le "nouveau" mot-clé? Je préférerais vraiment avoir ce tampon en tas non géré. Bien que j'écrive un code managé, de nombreuses autres DLL que j'utilise ne sont pas gérées.
Merci beaucoup. C'est vraiment une erreur élémentaire. Le débogueur ne se plaint pas de l'erreur jusqu'à ce que le thread tente de se terminer. VS débogueur n'est pas au courant de ce genre de situations? Je suis surpris que le débogueur ne gère pas bien. – Anniffer