线程在C ++中共享数据

时间:2012-03-06 11:27:16

标签: c++ multithreading concurrency

我有一个GUI线程需要来自另一个线程(IO线程)的信息。 IO线程所做的就是从串口获取信息。 Gui Thread所做的就是读取提取信息并将其显示在表格中。

我想也许,IO线程应该将数据放在受互斥锁保护的全局结构中,然后GUI线程应该从该结构读取。有更好的实施吗? 在这种情况下,关键部分的使用是否优于互斥锁?

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

谢谢!

2 个答案:

答案 0 :(得分:2)

一种方法是让你的IO线程将输入数据发布到GUI。每当您在IO线程上接收数据时,都将其打包在堆上的结构中,并将自定义消息与结构地址一起发送回GUI线程。 IOW您创建GUI线程,然后IO线程将GUI线程的句柄传递给IO线程,用于将数据发送回GUI。这样您就不需要关心互斥/临界区了,但是您要么使用现有的GUI消息队列,要么根据项目应该运行的环境创建自己的队列。

答案 1 :(得分:1)

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

至于你的关键部分,它只是指代让一部分代码只能一次执行的概念。主要是因为你可能会得到不一致的状态。创建关键部分的方法是使用锁定互斥锁和解锁互斥锁进行选通。