我有一个使用线程的C ++ wxWidgets程序。因此,我需要确保线程安全访问。在wxThread documentation中解释了如何执行此操作。他们使用friend
类和wxCriticalSection
来保护他们的线程。我在示例中做到了它并且工作正常,但是当我与同事谈论它时,他告诉我朋友类是邪恶的,应该完全避免以避免意外行为。我应该使用wxMutex
代替。
现在我理解他的观点,因为让我的main
作为朋友类给予线程类完全访问它。我明白,这可能会导致问题,例如,如果我有类似命名的变量或者无意识地访问其他我不应该在main之外使用的东西。但我想知道这种方法是否有任何优点。我的意思是,必须有一些东西,否则我无法理解为什么这种方式应该是(作为唯一的方式)在wxWidgets文档中描述的?
有人可以告诉我这两种方法的优缺点吗?或者,第三种方式是如何在不使用wxCriticalSection
或将其公开的情况下仅从主要访问friend
?谢谢你的帮助。
编辑:当我意识到我的代码中的关键部分是很久以前的工件时,这不再是必要的,这个问题对我的编程并不重要。不过,我认为这是一个有趣的话题,对未来的情况很有用。
答案 0 :(得分:1)
这个问题中有两个完全正交的东西:
friend
确实是一个坏主意,wxThread
文档中的示例可以(并且应该)重写以避免它。最简单的方法是重置wxEVT_COMMAND_MYTHREAD_COMPLETED
事件处理程序中的线程指针。wxCriticalSection
在语义上与wxMutex
完全相同,事实上,在非Windows平台下,它们完全相同。在Windows下,wxCriticalSection
只是一种更有效的互斥体(两个类都直接对应于Win32 API中的对应物)。如果你使用它来保护一些共享数据,那么使用wxCS
而不是wxMutex
是完全正常的,事实上,首选。您需要wxMutex
使用wxCondition
。