我很好奇这是否是我可以做的事情:
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*>
,如果我愿意,它可以达到同样的目的,但这不是一种更清晰的方法来获得那种“全球性”吗?
对此有点不安的是,我没有强制我的新线程有一个消息读取循环,以便能够处理终止消息。
答案 0 :(得分:4)
这很好,主要是。您需要使用某种互斥锁保护all_threads
的访问权限(读取或修改两者)。此外,如果您在程序过程中经常销毁线程,最好使用::std::set
。
另外,我有一个问题,有任何类型的全局变量。我认为如果你有一个'线程管理器'对象,你传递了你创建的线程,或者是一个跟踪它创建的所有线程的线程工厂,它会更清晰。
全局变量使程序更难以测试,并使它们更脆弱,以后不太可能被修改。
答案 1 :(得分:1)
如果多个线程尝试加入同一个线程,某些操作系统上的未定义行为
all_threads
需要受push_back
,remove
以及可能尝试迭代它的任何其他读者的互斥锁保护
th
的其他线程可能会在分配之前或期间尝试对all_threads
执行某些操作,您可能希望在互斥锁保护块中包含对th
的修改这会导致线程破坏序列化,因为push_terminate_thread_message
被发送到单个线程,然后完成join
。通常最好发送所有终止消息,然后执行所有joins
。
虽然在某些有限的情况下threadFuncArg
可能会被滥用,但我并不清楚线程应该如何知道队列
Omnifarious建议使用正确的线程池更具吸引力。