1

这是我的问题:

我正在创建线程

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 ()关闭线程句柄并重新启动它,但没有任何帮助。

4

1 回答 1

2

可能是函数 StaticMethodInvokingTheThreadFunc 并没有真正的 LPTHREAD_START_ROUTINE 签名,但这被函数指针强制转换为它的事实所掩盖。移除石膏。如果编译器开始抱怨然后调整你的函数的签名。

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

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

于 2012-09-27T09:16:20.973 回答