我们有以下类定义:
CThread::CThread () { this->hThread = NULL; this->hThreadId = 0; this->hMainThread = ::GetCurrentThread (); this->hMainThreadId = ::GetCurrentThreadId (); this->Timeout = 2000; //milliseconds } CThread::~CThread () { //waiting for the thread to terminate if (this->hThread) { if (::WaitForSingleObject (this->hThread, this->Timeout) == WAIT_TIMEOUT) ::TerminateThread (this->hThread, 1); ::CloseHandle (this->hThread); } } //********************************************************* //working method //********************************************************* unsigned long CThread::Process (void* parameter) { //a mechanism for terminating thread should be implemented //not allowing the method to be run from the main thread if (::GetCurrentThreadId () == this->hMainThreadId) return 0; else { m_pMyPointer = new MyClass(...); // my class successfully works here in another thread return 0; } } //********************************************************* //creates the thread //********************************************************* bool CThread::CreateThread () { if (!this->IsCreated ()) { param* this_param = new param; this_param->pThread = this; this->hThread = ::CreateThread (NULL, 0, (unsigned long (__stdcall *)(void *))this->runProcess, (void *)(this_param), 0, &this->hThreadId); return this->hThread ? true : false; } return false; } //********************************************************* //creates the thread //********************************************************* int CThread::runProcess (void* Param) { CThread* thread; thread = (CThread*)((param*)Param)->pThread; delete ((param*)Param); return thread->Process (0); } MyClass* CThread::getMyPointer() { return m_pMyPointer; }
在主程序中,我们有以下内容:
void main(void) { CThread thread; thread.CreateThread(); MyClass* myPointer = thread.getMyPointer(); myPointer->someMethod(); // CRASH, BOOM, BANG!!!! }
在使用myPointer时(在主线程中)它崩溃了.我不知道如何获得指向内存的指针,在另一个线程中分配.这有可能吗?
所有线程都可以访问应用程序的内存空间.默认情况下,无论上下文如何,任何线程都可以看到任何变量(唯一的例外是声明__delcspec(thread)的变量)
由于竞争条件,你正在崩溃.刚刚创建的线程在调用getMyPointer时尚未开始运行.您需要在新创建的线程和原始线程之间添加某种同步.换句话说,原始线程必须等到新线程发信号通知它已创建对象.