私は.Netの初心者で、管理されたスレッドを使用しようとしています。 私のコードで問題が見つかりませんでしたが、スレッド終了時に例外が発生します。 何かのように: 0x5cbf80ea(msvcr90d.dll)で処理されない例外 0xC0000005:0x000000d7を読み取るアクセス違反。管理されていない配列を管理対象スレッドに渡す。 - メモリの破損
#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;
}
しかし、グローバルアレイとしてバッファを割り当てるとうまく動作します。この例外は、「新しい」キーワード、つまり動的なメモリ割り当てを使用した場合に発生します。 私は何か基本的な間違いを犯していますか? これはガベージコレクタを処理するものですか?または "新しい"キーワードによって割り当てられたアンマネージド・ヒープ? アンマネージヒープにこのバッファを置くのが本当に好きです。私はマネージコードを書いていますが、私が使用している他の多くのDLLはアンマネージドです。
ありがとうございます。それは本当に基本的な間違いです。 スレッドが終了しようとするまで、デバッガは間違いについては不平を言っていません。 VSデバッガはこのような状況を認識していませんか?私はデバッガがこれをうまく扱えないことに驚いています。 – Anniffer