c++ - 新线程只发出第一条指令并且永远不会恢复

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

最佳答案

可能是函数 StaticMethodInvokingTheThreadFunc 并不真正具有 LPTHREAD_START_ROUTINE 的签名,但这被函数指针强制转换为它的事实所掩盖。删除类型转换。如果编译器开始提示,那么调整你的函数的签名。

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

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

关于c++ - 新线程只发出第一条指令并且永远不会恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617689/

相关文章:

c++ - 在 C++ 中使用临时对象作为默认参数是否安全?

c++ - ODB C++ - 未知的数据库架构错误

c++ - 在 Qt 中更改标签

Windows:WAITING进程完成

windows - 删除 echo 到 .txt 后的尾随空格

java - 使用 @Async 注释限制线程数并在达到最大线程数时等待

c++ - 检查当前文件是否为 doc、docx、xls、xlsx 或 pdf 格式

c++ - 如何缩短 Windows RPC 调用超时时间?

java - 套接字 ClassCastException HashMap

C Pthreads - 线程安全队列实现的问题