wxThread文档示例有用还是糟糕的编码实践?

时间:2016-12-01 09:25:59

标签: c++ multithreading wxwidgets friend

我有一个使用线程的C ++ wxWidgets程序。因此,我需要确保线程安全访问。在wxThread documentation中解释了如何执行此操作。他们使用friend类和wxCriticalSection来保护他们的线程。我在示例中做到了它并且工作正常,但是当我与同事谈论它时,他告诉我朋友类是邪恶的,应该完全避免以避免意外行为。我应该使用wxMutex代替。

现在我理解他的观点,因为让我的main作为朋友类给予线程类完全访问它。我明白,这可能会导致问题,例如,如果我有类似命名的变量或者无意识地访问其他我不应该在main之外使用的东西。但我想知道这种方法是否有任何优点。我的意思是,必须有一些东西,否则我无法理解为什么这种方式应该是(作为唯一的方式)在wxWidgets文档中描述的?

有人可以告诉我这两种方法的优缺点吗?或者,第三种方式是如何在不使用wxCriticalSection或将其公开的情况下仅从主要访问friend?谢谢你的帮助。

编辑:当我意识到我的代码中的关键部分是很久以前的工件时,这不再是必要的,这个问题对我的编程并不重要。不过,我认为这是一个有趣的话题,对未来的情况很有用。

1 个答案:

答案 0 :(得分:1)

这个问题中有两个完全正交的东西:

  1. 使用friend确实是一个坏主意,wxThread文档中的示例可以(并且应该)重写以避免它。最简单的方法是重置wxEVT_COMMAND_MYTHREAD_COMPLETED事件处理程序中的线程指针。
  2. wxCriticalSection在语义上与wxMutex完全相同,事实上,在非Windows平台下,它们完全相同。在Windows下,wxCriticalSection只是一种更有效的互斥体(两个类都直接对应于Win32 API中的对应物)。如果你使用它来保护一些共享数据,那么使用wxCS而不是wxMutex是完全正常的,事实上,首选。您需要wxMutex使用wxCondition