这是我的问题:
我正在创建线程
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 ()
关闭线程句柄并重新启动它,但没有任何帮助。
最佳答案
可能是函数 StaticMethodInvokingTheThreadFunc 并不真正具有 LPTHREAD_START_ROUTINE 的签名,但这被函数指针强制转换为它的事实所掩盖。删除类型转换。如果编译器开始提示,那么调整你的函数的签名。
在您的情况下调用 CreateThread 可能是错误的。 99%的情况都是错误的,你真的应该调用CRT库函数_beginthreadex
。这个函数在内部调用 CreateThread,但它也做一些初始化工作。将 CreateThread 替换为 _beginthreadex。
可能是在 StaticMethodInvokingTheThreadFunc 中执行挂起,在打印文本“thread func started”之后。修改函数中的代码,或在最后一个函数的行下一个断点并调试项目以查看是否会命中断点。
关于c++ - 新线程只发出第一条指令并且永远不会恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617689/