C/C++多线程问题?
#include<windows.h>#include<process.h>#include<iostream>usingnamespacestd;classJThrea...
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
class JThread
{
public:
virtual void Run() = 0;
void Start()
{
hThread = (HANDLE)_beginthreadex(NULL,0,JThread::ThreadFun,this,0,NULL);
}
static unsigned __stdcall ThreadFun(void *lpParameter)
{
JThread* p = (JThread*)lpParameter;
p->Run();
if (p->isAutoDel)
{
delete p;
}
return 0;
}
HANDLE hThread;
bool isAutoDel;
};
class JTest : public JThread
{
public:
void Run()
{
for (int i=0;i<num;i++)
{
cout<<"test"<<endl;
Sleep(1000);
}
}
~JTest()
{
if (isAutoDel)
{
CloseHandle(hThread);
return;
}
DWORD ret = WaitForSingleObject(hThread,INFINITE);
if (WAIT_OBJECT_0 == ret)
{
CloseHandle(hThread);
}
}
int num;
};
注:实现短暂现在自动消亡,长时间线程则等待。
问:为什么线程函数要定义成static,
还有,定义短线程时要用JTest* th = new JTest; 可以自动消亡,我们老师说如果定义长时间线程如果用JTest* th = new JTest指针要保存起来,供以后释放,这是为什么?
那不封装类的时候,没用static。然道也是动态分配,那这个动态分配为什么就可以了? 展开
#include <process.h>
#include <iostream>
using namespace std;
class JThread
{
public:
virtual void Run() = 0;
void Start()
{
hThread = (HANDLE)_beginthreadex(NULL,0,JThread::ThreadFun,this,0,NULL);
}
static unsigned __stdcall ThreadFun(void *lpParameter)
{
JThread* p = (JThread*)lpParameter;
p->Run();
if (p->isAutoDel)
{
delete p;
}
return 0;
}
HANDLE hThread;
bool isAutoDel;
};
class JTest : public JThread
{
public:
void Run()
{
for (int i=0;i<num;i++)
{
cout<<"test"<<endl;
Sleep(1000);
}
}
~JTest()
{
if (isAutoDel)
{
CloseHandle(hThread);
return;
}
DWORD ret = WaitForSingleObject(hThread,INFINITE);
if (WAIT_OBJECT_0 == ret)
{
CloseHandle(hThread);
}
}
int num;
};
注:实现短暂现在自动消亡,长时间线程则等待。
问:为什么线程函数要定义成static,
还有,定义短线程时要用JTest* th = new JTest; 可以自动消亡,我们老师说如果定义长时间线程如果用JTest* th = new JTest指针要保存起来,供以后释放,这是为什么?
那不封装类的时候,没用static。然道也是动态分配,那这个动态分配为什么就可以了? 展开
展开全部
WINDOWS线程需要这样的函数体:
DWORD WINAPI thread_proc(LPVOID lpParam)
{
...
return 0;
}
C语言中直接调用线程就是CreateThread(&thread_proc, ...)即可
因为C++的类是在运行阶段分配地址,而不是在编译阶段分配地址,所以要想在类函数中声明线程,就必须强制把线程成员函数设置为编译阶段就分配地址,这样才能绑定到WINDOWS API的CreateThread函数上去,这种方式叫做static.
之所以保存线程指针是因为现代多任务操作系统往往处于比较复杂的状态。比如,假设你的线程是用于下载某个网络资源,如电影等;同时网络用户调整了带宽,或者开始打游戏,或者播放视频,这些都会影响CPU对当前定义的线程的资源控制。如果线程内部涉及了很多资源,如果不进行善后则后果比较严重(假设你的线程在下一个电影的局部片段,因为资源没有正常退出,导致整个电影文件即使全部下载下来也无法打开)。所以为了妥善处理,一般好的软件在主程序接到退出、终止、异常时,首先都会尝试【安全】退出线程,逐步关闭已打开的资源,如文件、数据库、管道、网络连接等等,再彻底退出。
假如你的线程用于网络游戏,那就更典型了,你不希望因为一时断网,导致下次再上的时候,装备全丢吧?
DWORD WINAPI thread_proc(LPVOID lpParam)
{
...
return 0;
}
C语言中直接调用线程就是CreateThread(&thread_proc, ...)即可
因为C++的类是在运行阶段分配地址,而不是在编译阶段分配地址,所以要想在类函数中声明线程,就必须强制把线程成员函数设置为编译阶段就分配地址,这样才能绑定到WINDOWS API的CreateThread函数上去,这种方式叫做static.
之所以保存线程指针是因为现代多任务操作系统往往处于比较复杂的状态。比如,假设你的线程是用于下载某个网络资源,如电影等;同时网络用户调整了带宽,或者开始打游戏,或者播放视频,这些都会影响CPU对当前定义的线程的资源控制。如果线程内部涉及了很多资源,如果不进行善后则后果比较严重(假设你的线程在下一个电影的局部片段,因为资源没有正常退出,导致整个电影文件即使全部下载下来也无法打开)。所以为了妥善处理,一般好的软件在主程序接到退出、终止、异常时,首先都会尝试【安全】退出线程,逐步关闭已打开的资源,如文件、数据库、管道、网络连接等等,再彻底退出。
假如你的线程用于网络游戏,那就更典型了,你不希望因为一时断网,导致下次再上的时候,装备全丢吧?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询