简单描述下问题:
用户登陆后,会创建一个登陆ID,并为该ID new一个类对象(假设为ClassA,该类来完成用户的某项操作)
ClassA中有三个函数:
1 dosomething()
2 undosomething()
3 static recvdata()
在dosomething()方法中调用createThread方法,启动recvdata()线程,从服务器段接收数据进行处理
recvdata(LPVOID lParam)
{
ClassA * pA = (ClassA*)lParam;
while(true)
{
收数据进行处理;
当没有数据时或超时break;
}
关闭SOCKET连接。
}
但是有两个问题:
1 如果用户在调用undosomething(停止接收数据)时,线程正在接收数据,如何停止?
2 如果用户退出,则会根据登陆ID来delete相应的类对象。如果这时线程也是正在接收数据,如何停止,毕竟线程参数就是该对象指针。 问题一,可以加一个停止变量m_isStop,并在访问的时候加锁,在线程的while循环处判断该变量,并且在undosomething中将该变量设为TRUE满足退出条件(当然也是互斥访问)
但是问题2怎么解决呢,想在ClassA的析构函数中调用下undosomething,先停止线程,但是万一对象删除的比线程结束的快,还是要出问题的,因为线程结束时需要使用对象中的东西,但这时可能对象已经析构完成了。程序可能会崩的。
有什么好办法么??
用户登陆后,会创建一个登陆ID,并为该ID new一个类对象(假设为ClassA,该类来完成用户的某项操作)
ClassA中有三个函数:
1 dosomething()
2 undosomething()
3 static recvdata()
在dosomething()方法中调用createThread方法,启动recvdata()线程,从服务器段接收数据进行处理
recvdata(LPVOID lParam)
{
ClassA * pA = (ClassA*)lParam;
while(true)
{
收数据进行处理;
当没有数据时或超时break;
}
关闭SOCKET连接。
}
但是有两个问题:
1 如果用户在调用undosomething(停止接收数据)时,线程正在接收数据,如何停止?
2 如果用户退出,则会根据登陆ID来delete相应的类对象。如果这时线程也是正在接收数据,如何停止,毕竟线程参数就是该对象指针。 问题一,可以加一个停止变量m_isStop,并在访问的时候加锁,在线程的while循环处判断该变量,并且在undosomething中将该变量设为TRUE满足退出条件(当然也是互斥访问)
但是问题2怎么解决呢,想在ClassA的析构函数中调用下undosomething,先停止线程,但是万一对象删除的比线程结束的快,还是要出问题的,因为线程结束时需要使用对象中的东西,但这时可能对象已经析构完成了。程序可能会崩的。
有什么好办法么??
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货