2012-03-06 119 views
0

我有一个GUI线程需要来自另一个线程(IO线程)的信息。 IO线程的所有工作都是从串口获取信息。 Gui致其所有的功能就是读取提取信息并将它们显示在表格中。在C++中共享数据的线程

我在想也许,IO线程应该把数据放在受互斥锁保护的全局结构中,然后GUI线程应该从该结构读取数据。有更好的实施吗? 在这种情况下,使用临界区比互斥更好吗?

现在我知道我会得到一个回复​​,说你为什么不使用GUI线程来获取IO数据,所以我不需要多线程。是的,我知道我只是想举一个简单的例子来学习最佳实践:)

谢谢!

回答

1

我建议是同一个结构的两个不同的实例。当您的IO线程准备好更新GUI线程时,它会抓取一个互斥体,将其结构复制到GUI线程的结构中,解锁互斥体并通知GUI线程它应该读取结构的更新副本。

至于你的关键部分,这只是指一段代码只能执行一次的概念。主要是因为你可能会得到不一致的状态。您创建临界区的方式是使用锁互斥和解锁互斥对其进行门控。

+0

嗨,每个复制都有什么好处一个拥有自己的结构体然后共享一个全局结构体,我仍然会像你提到的那样在任何情况下使用互斥体? 关于关键部分,我认为有些东西实际上被称为操作系统的关键部分,就像一个互斥体,因为我认为互斥体总是名为互斥体,因此在应用程序中共享。 – Kam 2012-03-06 11:45:49

+0

嗯如果我需要通知GUI线程何时读取它自己的结构副本,那么我甚至不需要一个互斥体,因为我不会写它的结构,而从它读取反正,不是吗? – Kam 2012-03-06 11:48:16

+0

好吧,当你创建副本时(从IO线程本地到GUI线程结构),你仍然需要一个互斥体,但是你不需要一个互斥体,停止GUI线程从结构中随意读取它将始终处于一致的状态。 即使在通知后经过10秒,您仍然无法确定GUI是否正在读取,但可能并不安全地更新其结构。所以,在这个周围放置一个互斥锁,但除了那么短的时间之外,GUI线程还是可以阅读的。 – 2012-03-06 11:51:36

2

一种方法是让IO线程将输入数据发布到GUI。只要你在IO线程上接收到数据,就将它打包在堆上的结构中,并将自定义消息和结构的地址一起发回到GUI线程。 IOW创建GUI线程,然后IO线程将GUI线程的句柄传递给IO线程,以用于将数据发送回GUI。这样你就不需要关心互斥/关键部分,但是你可以使用现有的GUI消息队列,或者根据你的项目应该运行的环境来创建你自己的环境。

+0

+1用于在正常GUI线程上使用消息排队缓冲区实例/结构输入队列。 – 2012-03-07 00:08:35