线程间通信(工作线程)

时间:2010-06-28 16:31:54

标签: winapi multithreading

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

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

我找不到一个Windows函数,它允许我通过线程ID或返回的HANDLE向工作线程和引用工作线程的主线程发送数据。我不想在我的项目中引入MFC依赖项,并希望听到有关其他人在这种情况下将如何做或做过的任何建议。在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

首先,您应该记住,Windows提供了许多机制来处理线程:I/O Completion Portsold thread poolsnew thread pools。根据您正在做的事情,它们可能对您的目的有用。

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

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

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

答案 1 :(得分:1)

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

根据您的工作情况,它可以非常简单。

Thread1Func() {
  Set some global data
  Signal semaphore to indicate it is available
}

Thread2Func() {
  WaitForSingleObject to check/wait if data is available
  use the data
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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