作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很好奇这是否是我能做的事情:
using namespace tthread;
class E_thread {
static std::list<E_thread*> all_threads;
thread th;
E_messageQueue queue;
public:
E_thread(void (*threadFunction)(void *), void * threadFuncArg) {
all_threads.push_back(this);
th = thread(threadFunction,threadFuncArg);
}
~E_thread() {
queue.push_terminate_thread_message();
th.join();
all_threads.remove(this);
}
};
我的目的是让任何线程都可以轻松地生成新线程或向另一个线程发送消息,并且线程列表也能够自行清理。据我了解,我可以替换 all_threads
与全局 std::list<E_thread*>
如果我愿意的话,它的目的是相同的,但这不是获得那种“全局性”的更简洁的方法吗?
对此有点不安的是我没有强制我的新线程有一个消息读取循环,以便能够处理终止消息。
最佳答案
这很好,主要是。您需要使用某种互斥锁来保护对 all_threads
的访问(读取或修改两者)。此外,如果您在程序执行过程中经常销毁线程,则最好使用 ::std::set
。
另外,我有点质疑是否有任何类型的全局变量。我认为如果您有一个“线程管理器”对象并在您创建的线程中传递,或者可能有一个跟踪它创建的所有线程的线程工厂,那会更干净。
全局变量使程序更难测试,并使它们更脆弱且以后无法修改。
关于C++ 静态类成员指的是自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5386133/
我是一名优秀的程序员,十分优秀!