我有一个使用线程的C ++ wxWidgets程序。因此,我需要确保可以安全地访问线程。在wxThread documentation中,说明了如何执行此操作。他们使用friend类和wxCriticalSection来保护其线程。我按照示例中的方法进行操作,并且效果很好,但是当我与一位同事交谈时,他告诉我朋友班是邪恶的,应该完全避免,以免发生意料之外的行为。我应该改用wxMutex

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

有人可以启发我介绍这两种方法的优缺点吗?还是有第三种方式,我可以从主目录仅访问wxCriticalSection而不使用friend或将其公开?谢谢您的帮助。



编辑:由于我意识到代码中的关键部分是很久以前的工件,因此不再需要了,这个问题对我的编程而言并不重要。不过,我认为这是一个有趣的话题,并且对将来的情况很有用。

最佳答案

这个问题有2个完全正交的事物:


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

关于c++ - wxThread文档示例有用或不好的编码实践?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40906807/

10-09 06:00