我创建了两个线程A& B使用CreateThread Windows API。我正在尝试将数据从线程A发送到B.
我知道我可以使用Event对象并使用“WaitForSingleObject”方法在另一个中等待Event对象。这个事件所做的只是发出信号。而已! 但是我如何发送数据。我也不希望线程B等到线程A发出信号。它有自己的工作要做。我无法等待。
我找不到一个Windows函数,它允许我通过线程ID或返回的HANDLE向工作线程和引用工作线程的主线程发送数据。我不想在我的项目中引入MFC依赖项,并希望听到有关其他人在这种情况下将如何做或做过的任何建议。在此先感谢您的帮助!
答案 0 :(得分:4)
首先,您应该记住,Windows提供了许多机制来处理线程:I/O Completion Ports,old thread pools和new 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在他的代码中做了线程安全队列。