有请C/C++高手to solve a multi_threading problem

来源:百度知道 编辑:UC知道 时间:2024/09/25 10:37:27
/*************************
* Note: You can copy the code and then run it on you machine to help me.
*
* if( YouSolveIt() )
* {
* while(true)
* ThankYou();
* }
**************************/
/************************
* 源代码:
*************************/

#include<stdio.h>
#include<windows.h>
#include<process.h>

typedef unsigned (WINAPI *FUNC_POINTER)(LPVOID lpThreadPara);
typedef unsigned *PTHREAD_ID;

DWORD ThreadFunc(LPVOID para);

class ThreadObject
{
public:
ThreadObject();
void StartThread();
virtual DWORD ThreadMemberFunc();
void WaitForExit();
private:
HANDLE m_hThread;
DWORD m_threadId;
};

ThreadObject::ThreadObject()
{
m_hThread=NULL;
m_threadId=0;
}

void ThreadObject::StartThread()
{
m_hThread = (HANDLE)_beginthreadex

`搞定了!LZ,出错的地方不在你的注释处,在这儿:
DWORD ThreadFunc(LPVOID para)
{
ThreadObject *pTo=(ThreadObject*)para;
return pTo->ThreadMemberFunc();
}
这是线程处理函数,其中的para是_beginthredex创建线程时所代入的,也就是它的第四个参数.你设成0,这里的para也就是0,不信可以加一句printf("para=%d",para)看看!所以pTo寻址错误导致程序崩溃.
所以正确的写法应该是在调用_beginthreadex时将this指针代入,即
m_hThread=(HANDLE)_beginthreadex(NULL,0,(FUNC_POINTER)ThreadFunc,this,0,(PTHREAD_ID)&m_threadId);
这样就可以啦,我已经编译通过啦~~~

学学调试吧,你用什么环境呢?集成环境都有断点、单步运行等,很容易找出错误。