新线程只制作第一条指令,永不恢复

时间:2012-09-27 09:00:16

标签: c++ windows multithreading

这是我的问题:

我正在创建线程

HANDLE Threads[THREAD_NUM]

启动主题

void LaunchThread (int i) {
  *some checks if the handle is not null etc*;
  DWORD threadId;
  threads[i] = CreateThread ( 
    NULL,
    0,
    (LPTHREAD_START_ROUTINE)*StaticMethodInvokingTheThreadFunc, 
    *StructPassingToThatMethod ( basically have a pointer and thread number)*,
    0,
    &threadId);
  *DebugMessage "thread created"*;
  *DebugMessage "with id = (threadId)"*;
}

静态方法调用函数

void DoSmth () {
  *DebugMessage "thread func started"*;
  ...;
  *then code with another messages all the way*;
}

等待功能很简单

void WaitThread (i){
  *DebugMessage "wait for thread to finish"*;
  WaitForSingleObject (Threads[i], INFINITE);
}

在主要功能中顺序:

LaunchThread (i);
WaitThread (i);

程序永远不会返回WaitThread ()函数,而(!)消息列表看起来像

"thread created"
"thread func started" (and nothing done after that message in DoSmth () func)
"with id = .."
"wait for thread to finish"

即使使用1个线程也会发生这种情况...... 对于几个线程我只是

 for ( int t = 0; t < THREAD_NUM; t++)
   LaunchThread (t);

和等待线程的相同循环

为什么会这样? 我尝试ResumeThread (),关闭线程并重新启动它,但没有任何帮助。

1 个答案:

答案 0 :(得分:2)

可能是函数StaticMethodInvokingTheThreadFunc实际上没有LPTHREAD_START_ROUTINE的签名,但是这被函数指针强制转换为它所掩盖。删除演员。如果编译器开始抱怨,那么请调整函数的签名。

在您的情况下调用CreateThread可能是错误的。 99%的情况都是错误的,你应该真正调用CRT库函数_beginthreadex。这个函数在内部调用CreateThread,但它也做了一些初始化的东西。用_beginthreadex替换CreateThread。

在打印“thread func started”文本后,可能会在StaticMethodInvokingTheThreadFunc中挂起执行。修改函数中的代码,或在最后一个函数的行上放置一个断点并调试项目以查看是否会遇到断点。