wxThread 文档示例有用还是不好的编码实践?

wxThread documentation example usefull or bad coding practice?

我有一个使用线程的 C++ wxWidgets 程序。因此我需要确保安全地访问线程。在 wxThread documentation it is explained how to do so. They use friendclasses and wxCriticalSection to secure their threads. I did it like in the example and it works fine, though when I talked to a collegue about it, he told me friend classes are evil and should be avoided alltogether to avoid unexpected behaviour. I should use wxMutex 而不是。

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

谁能告诉我这两种方法的优缺点?或者有没有第三种方法我可以只从主访问 wxCriticalSection 而无需使用 friend 或使其成为 public?感谢您的帮助。


编辑:当我意识到我代码中的关键部分是很久以前的人工制品时,不再需要了,这个问题对我的编程来说并不重要。尽管如此,我认为这是一个有趣的话题,对未来的情况会有用。

本题有2个完全正交的东西:

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