C++ 在C+中共享数据的线程+;

C++ 在C+中共享数据的线程+;,c++,multithreading,concurrency,C++,Multithreading,Concurrency,我有一个GUI线程,它需要来自另一个线程(IO线程)的信息。 IO线程的所有工作都是从串行端口获取信息。 Gui线程的所有操作都是读取回迁信息并将其显示在表中 我在想,IO线程应该把数据放在一个受互斥锁保护的全局结构中,然后GUI线程应该从该结构中读取数据。是否有更好的实施方案? 在这种情况下,使用临界区会比使用互斥更好吗 现在我知道我会得到一个回复,说为什么不只使用GUI线程来获取IO数据,这样我就不需要多线程了。是的,我知道我只是想举一个简单的例子来学习最佳实践:) 谢谢大家! 我建议的是同

我有一个GUI线程,它需要来自另一个线程(IO线程)的信息。 IO线程的所有工作都是从串行端口获取信息。 Gui线程的所有操作都是读取回迁信息并将其显示在表中

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

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


谢谢大家!

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


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

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


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

一种方法是让IO线程将输入数据发布到GUI。每当您在IO线程上收到数据时,您就将其打包到堆上的结构中,并将自定义消息连同结构的地址一起发布回GUI线程。IOW创建GUI线程,然后IO线程将GUI线程的句柄传递给IO线程,以用于将数据发送回GUI。通过这种方式,您不需要关心互斥体/关键部分,但可以使用现有的GUI消息队列,也可以根据项目运行的环境创建自己的消息队列。

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

Hi,复制每个具有自己的结构然后共享一个全局结构有什么好处,我仍然会像你提到的那样在任何情况下使用互斥锁?关于critical section,我认为在操作系统中有一种叫做critical section的东西,比如互斥体,因为我认为互斥体总是命名为互斥体,因此共享了accross应用程序,如果我需要通知GUI线程何时读取它自己的结构副本,那么我甚至不需要一个互斥体,因为我不会在它读取数据时写入它的结构,不是吗?好吧,当你复制时,你仍然需要一个互斥体(从IO线程本地到GUI线程结构)但是您不需要一个互斥锁来阻止GUI线程在其余时间随意读取结构,因为它将始终处于一致状态。您永远无法确定GUI是否正在读取,即使在通知发出10秒后,更新其结构可能还不安全。所以在这周围放一个互斥体,但是除了那一小段时间,GUI线程阅读是公平的游戏。嗨,复制每个都有自己的结构然后共享一个全局结构有什么好处,我仍然会像你提到的那样在任何情况下使用互斥体?关于critical section,我认为在操作系统中有一种叫做critical section的东西,比如互斥体,因为我认为互斥体总是命名为互斥体,因此共享accross应用程序。嗨,复制每个都有自己的结构然后共享一个全局结构有什么好处,我仍然会像你提到的那样在任何情况下使用互斥体?关于critical section,我认为在操作系统中有一种叫做critical section的东西,比如互斥体,因为我认为互斥体总是命名为互斥体,因此共享了accross应用程序,如果我需要通知GUI线程何时读取它自己的结构副本,那么我甚至不需要一个互斥体,因为我不会在它读取数据时写入它的结构,不是吗?好吧,当你复制时,你仍然需要一个互斥体(从IO线程本地到GUI线程结构)但是您不需要一个互斥锁来阻止GUI线程在其余时间随意读取结构,因为它将始终处于一致状态。您永远无法确定GUI是否正在读取,即使在通知发出10秒后,更新其结构可能还不安全。所以在这周围放一个互斥体,但是除了那一小段时间,GUI线程阅读是公平的游戏。嗨,复制每个都有自己的结构然后共享一个全局结构有什么好处,我仍然会像你提到的那样在任何情况下使用互斥体?关于关键部分,我认为实际上有一个操作系统称为关键部分的东西,比如互斥体,因为我认为互斥体总是命名为互斥体,因此共享accross applications+1用于排队缓冲区实例/结构