【问题标题】:Inter-thread communication (worker threads)线程间通信(工作线程)
【发布时间】:2010-06-28 16:31:54
【问题描述】:

我使用 CreateThread windows API 创建了两个线程 A 和 B。我正在尝试将数据从线程 A 发送到 B。

我知道我可以使用 Event 对象并使用“WaitForSingleObject”方法在另一个中等待 Event 对象。这个事件所做的只是向线程发出信号。就是这样! 但是我如何发送数据。我也不希望线程 B 等到线程 A 发出信号。它有自己的工作要做。我等不及了。

我找不到允许我通过线程 ID 或返回的 HANDLE 向/从工作线程和引用工作线程的主线程发送数据的 Windows 函数。我不想在我的项目中引入 MFC 依赖项,并且想听听关于其他人在这种情况下将如何或已经完成的任何建议。提前感谢您的帮助!

【问题讨论】:

    标签: winapi multithreading


    【解决方案1】:

    首先,您应该记住,Windows 为您提供了许多处理线程的机制:I/O Completion Portsold thread poolsnew thread pools。根据您正在做的事情,其中​​任何一个都可能对您的目的有用。

    关于从一个线程向另一个线程“发送”数据,您有多种选择。 Windows 消息队列是线程安全的,一个线程(即使它没有窗口)可以有一个消息队列,您可以使用PostThreadMessage 将消息发送到该队列。

    我还在another answer 中发布了线程安全队列的代码。

    就让线程继续执行,但注意何时发生变化,典型的方法是让它调用WaitForSingleObject,超时值为0,然后检查返回值——如果是@987654327 @,事件(或其他)已设置,因此需要注意更改。如果是WAIT_TIMEOUT,则没有变化,可以继续执行。无论哪种方式,WaitForSingleObject 都会立即返回。

    【讨论】:

      【解决方案2】:

      由于两个线程在同一个进程中(至少听起来是这样),所以没有必要“发送”数据。他们可以共享它(例如,一个简单的全局变量)。您确实需要通过事件、信号量、互斥锁等来同步对它的访问。

      根据您正在做的事情,它可以非常简单。

      Thread1Func() {
        Set some global data
        Signal semaphore to indicate it is available
      }
      
      Thread2Func() {
        WaitForSingleObject to check/wait if data is available
        use the data
      }
      

      【讨论】:

      • 正确!假设线程 A 更新全局变量。它是如何暗示线程 B 的?
      • 线程 B 在调用 WaitForSingleObject 中等待,直到线程 A 发出信号。有什么方法可以让线程 B 继续其工作,而不是等待线程 A 发出信号?
      • @AKN:不要这样做。当你只有一个线程时,全局变量是有问题的——多线程会使问题成倍增加。只是不要这样做。
      • @AKN,线程 B 可以拥有自己的变量副本。工作完成后,它可以检查全局变量是否发生变化,复制值并重新开始工作,或者休眠或等待信号。
      • @AKN,WaitForSingleObject API 接受超时值。您可以指定 0 超时并根据返回值确定信号量是否已发出信号。这样它就不会等待,可以继续工作。
      【解决方案3】:

      如果您关心最小化 Windows 依赖关系,并且假设您使用 C++ 进行编码,那么我建议您使用 Boost.Threads,这是一个非常不错的类似 Posix 的 C++ 线程接口。这将使您在 Windows 和 Linux 之间轻松移植。

      如果你走这条路,那么使用互斥锁来保护跨线程共享的任何数据,并使用条件变量(与互斥锁结合)来通知一个线程与另一个线程。

      【讨论】:

        【解决方案4】:

        仅在一个进程中工作时不要使用互斥锁,因为它有更多开销(因为它是系统范围定义的对象)...在您的数据周围放置一个关键部分并尝试输入它(如Jerry Coffin 在他的代码中做了线程安全队列)。

        【讨论】:

          猜你喜欢
          • 2018-08-29
          • 1970-01-01
          • 2013-10-09
          • 1970-01-01
          • 2013-01-05
          • 2012-03-06
          相关资源
          最近更新 更多