【问题标题】:CreateThread issue in c under window OS窗口操作系统下c中的CreateThread问题
【发布时间】:2010-06-29 06:17:21
【问题描述】:

我有以下启动线程的代码。

int iNMHandleThread = 1;
HANDLE hNMHandle = 0;
hNMHandle = CreateThread( NULL, 0, NMHandle, &iNMHandleThread, 0, NULL);
if ( hNMHandle == NULL)
ExitProcess(iNMHandleThread);

我的问题是

  1. 如果我在线程已经处于运行状态时运行此代码会发生什么。
  2. 我想启动 NMHandle 的多个独立线程,请给我一些提示来解决这个问题。

【问题讨论】:

    标签: c++ c multithreading windows


    【解决方案1】:

    每次调用CreateThread 时,都会启动一个独立于任何其他当前正在运行的线程的新线程。您的“NMHandle”函数是否能够一次在多个线程上运行取决于您:例如,它是否依赖于任何全局状态?

    【讨论】:

    • 如何让 NMHandle 能够同时执行乘法运算。
    • 您不必做任何特别的事情。但是,如果您的 NMHandle 访问全局变量并且通常假设只有一个副本正在运行,您将遇到问题。不过,这更像是一个设计问题而不是编程问题。如果您可以发布您的 NMHandle 函数的代码,那么我们可以看看...
    • NMHandle 访问的每个对象及其调用的所有函数都必须是本地或线程本地的。
    • @Philipp: 或者使用某种锁定机制同步访问。
    • 同意Dean,我们必须使用一些同步机制来访问全局对象。比如 mu-tax 等。
    【解决方案2】:

    如果我在线程已经处于运行状态时运行此代码会发生什么。

    另一个线程将以函数NMHandle 开始,独立于另一个线程。

    我想启动 NMHandle 的多个独立线程,请给我一些提示来解决这个问题。

    这段代码实际上创建了一个独立的线程。如果要创建多个执行函数NMHandle 的线程,请创建一个循环。如果您稍后需要线程句柄(例如等待线程结束),则必须将它们存储在某个地方。

    确保NMHandle 是线程安全的。如果你不知道这意味着什么,那么你不应该开始多线程编程!

    还有另一个提示:您将指向本地堆栈变量iNMHandleThread 的指针传递给线程。一旦函数返回,变量内容可能不再具有其预期值 - 您应该按值传递数字 (CreateThread( NULL, 0, NMHandle, (void*)iNMHandleThread, 0, NULL);)。

    【讨论】:

      【解决方案3】:
      1. CreateThread 创建一个新线程。新线程之前显然不能处于运行状态 - 它在创建之前没有 状态。比较简单的语句int i = 42; - 在 42 之前没有 i 的先验值,因为该对象还不存在。显然,调用 CreateThread() 的旧线程必须正在运行 - 否则它无法运行到调用 CreateThread() 的行!

      2. 每次调用 CreateThread,都会得到一个新线程。您还将为每个调用获得一个新的线程句柄和 ID。所以你不能将它们全部存储在int iNMHandleThreadHANDLE hNMHandle 中。考虑std::list<int> NmThreadIDsstd::list<HANDLE> NmThreadHandles;

      此外,所有新线程都将从调用NMHandle() 开始。该函数是线程安全的吗?也就是说,当两个线程同时执行,或交错执行,或以任何其他随机顺序执行时,该函数会正常工作吗?像互斥锁和临界区这样的机制可以用来排除一些不安全的执行顺序。

      【讨论】:

        猜你喜欢
        • 2022-10-16
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 2011-10-14
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多