【问题标题】:Calling functions meant for threads normally调用通常用于线程的函数
【发布时间】:2010-08-08 19:04:00
【问题描述】:

我有一个原型函数

DWORD WINAPI blah(LPVOID arg);

这意味着与 CreateThread 一起用于线程应用程序。

我用 CreateThread 调用它没有问题。但是在代码中的其他地方,我通常称之为blah(NULL)。当它到达这部分时,它会崩溃。这是因为 WINAPI 部分使它成为 __stdcall 并且您不能像那样调用 __stdcall 函数吗?

【问题讨论】:

  • 很难说没有blah的定义。这可能是各种各样的事情。
  • 函数中有什么?它是否取消引用您传递的空指针?
  • 不,它不使用参数。我只是想知道程序是否会崩溃,因为它是 __stdcall 但我不是从 CreateThread 调用它。
  • 当您应该询问问题时,您询问的是一个步骤。而不是子问题“会因为__stdcall而崩溃”,您应该只询问完整的问题(让我们看到函数)“为什么在没有CreateThread的情况下调用时会崩溃...”,这可能导致“哦,你不能用__stdcall 调用它。”永远不要问子问题,只问真正的问题。顺便说一句,调用它应该没问题。
  • 你是直接调用还是通过回调之类的方式调用它?

标签: c++ multithreading crash stdcall


【解决方案1】:

不是因为__stdcall。在调试器中启动您的程序并检查哪一行代码导致您崩溃。

【讨论】:

    【解决方案2】:

    唯一的问题是如果blah() 专门调用TerminateThread(self) 来结束,而不是仅仅从底部返回。 CreateThread 调用设置返回地址,这样当 blah() 返回时,它调用 TerminateThread

    如果 blah() 没有任何类似的代码,则需要检查代码以查看它是否以某种方式执行了特定于线程的操作,从而使其失败。顺便说一句,我想不出其他任何东西(除了 TerminateThread())可能会导致编写的代码成为一个线程,从而阻止它被直接调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2015-11-14
      • 2021-10-09
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多