类中静态线程函数调用本类的其他静态成员函数和调用其他类的成员函数的奇怪问题,请指点解释。

betsyalan 2004-12-18 04:52:14
一个类
Class A
{
public:
void StartThread();
static UINT ThreadFun(LPVOID lParam);
static void Fun();
};

void A::StartThread()
{
AfxBeginThread((AFX_THREADPROC)A::ThreadFun,(LPVOID)NULL);
}
UINT A::ThreadFun(LPVOID lParam)
{
for(;;)
{
Sleep(0);
//此处调用Fun()函数,该函数处理时间比较长
Fun();
//其他处理

}
}

调试运行的时候,发现在进入Fun计算过程中,for循环还没等Fun返回,就进行下一次循环了,造成的结果是Fun在同时间执行了两次。
问题是:线程循环中为什么会出现函数没返回就执行下一个循环了?

另外一个情况是:

Class B
{
//..
};

线程调用该类的其他函数执行一些计算
UINT A::ThreadFun(LPVOID lParam)
{
B b;
for(;;)
{
Sleep(0);
//此处调用class B的成员函数,该函数处理时间比较长
b.somefun();
//其他处理

}
}

线程执行以后,同样出现还类b的函数还没返回就继续下一个循环了,这种情况又是什么原因?
...全文
202 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
betsyalan 2004-12-20
  • 打赏
  • 举报
回复
使用互斥量等同步控制不是应用在多线程上吗?我这个是同一线程里的函数,难道需要在同线程的函数里做互斥,或者在函数后面等待?关键是我在该线程循环执行几个函数或者对象的函数,难道这样也需要同步?
betsyalan 2004-12-20
  • 打赏
  • 举报
回复
终于找到问题了,谢谢上面的高手的启发,我在调用的函数中返回后,做判断是否成功,如果不成功就continue,调试的时候没仔细检查逻辑关系,以为是调用了多次该函数了,实际上同一线程是不会异步调用同线程内同一个函数或对象函数的。揭贴
betsyalan 2004-12-20
  • 打赏
  • 举报
回复
StartThread只调用了一次,因为它是在程序OnCreate里执行的,创建了该线程以后,该线程就循环执行,直到程序结束。
oyljerry 2004-12-20
  • 打赏
  • 举报
回复
检查一下fun中的代码,看是不是异常了
xzqchat 2004-12-20
  • 打赏
  • 举报
回复
应该是 fun 的问题 或者 还启动了其他线程。

最后,你判断它执行两次的标准是什么?这也可能是一个问题。
najzni 2004-12-20
  • 打赏
  • 举报
回复
如果在Fun里没有开其他线程的话应该不会出现这个问题啊,很奇怪
Anikan 2004-12-20
  • 打赏
  • 举报
回复
你确定A::StartThread 没有连续被调用两次?
betsyalan 2004-12-20
  • 打赏
  • 举报
回复
Fun()里绝对没有跳出或者新开线程,只是执行了一些比较长时间的处理而已,例如数据库的一些查询,文件的打开、写数据等。而且关键是执行类的对象函数也有这样的问题,莫名其妙,现在主要是想了解清楚为什么会这样或者那些情况有可能产生这样的问题?
likongxu 2004-12-20
  • 打赏
  • 举报
回复
同一个线程里面不可能异步执行,Fun();应该要执行完毕才能往下跑。是不是你Fun();函数里面又新开线程了?
oyljerry 2004-12-20
  • 打赏
  • 举报
回复
是不是函数跳出了
oyljerry 2004-12-20
  • 打赏
  • 举报
回复
需要控制线程的同步
maofly 2004-12-18
  • 打赏
  • 举报
回复
线程本身就是这样,异步执行。因为你没有同步控制!!
在侯捷译的《win32 多线程程序设计》中就有,用Sleep()中的时间长点,或者调用等待线程结束函数。
EnochShen 2004-12-18
  • 打赏
  • 举报
回复
用互斥量,或者Sleep大一点

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧