C++类成员是指自我

C++类成员是指自我,c++,multithreading,C++,Multithreading,我很好奇这是否是我能做的事情: 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.pus

我很好奇这是否是我能做的事情:

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);
    }
};
我的意图是让任何线程都可以轻松地生成新线程或向另一个线程发送消息,并且线程列表也能够在其自身之后进行清理。据我所知,我可以用一个全局std::list替换所有的线程,如果我想的话,它的作用是相同的,但是这不是一个获得那种全局性的更干净的方法吗


有点不安的是,我没有强迫我的新线程有一个消息读取循环,以便能够处理终止消息

基本上,这很好。您需要使用某种互斥锁来保护对所有线程的读取或修改。另外,如果在程序运行过程中经常破坏线程,那么最好使用::std::set

还有,我有一个问题,关于任何类型的全局变量。我认为如果你有一个“线程管理器”对象,你在创建一个线程的过程中传递它,或者有一个线程工厂跟踪它创建的所有线程,它会更干净


全局变量使程序更难测试,并且使程序更脆弱,以后修改的能力也更小。

这基本上是好的。您需要使用某种互斥锁来保护对所有线程的读取或修改。另外,如果在程序运行过程中经常破坏线程,那么最好使用::std::set

还有,我有一个问题,关于任何类型的全局变量。我认为如果你有一个“线程管理器”对象,你在创建一个线程的过程中传递它,或者有一个线程工厂跟踪它创建的所有线程,它会更干净

全局变量使程序更难测试,并且使程序更脆弱,以后修改的能力更低

如果多个线程试图加入同一个线程,则某些操作系统上的行为未定义

所有的线程都需要一个互斥锁来保护,以便推回、删除和任何其他可能尝试在其上迭代的读取器

如果迭代所有_线程的其他线程可能试图在分配th之前或期间对th执行某些操作,则您可能希望在互斥保护块中包含对th的修改 这有串行化线程销毁的趋势,因为push_terminate_thread_消息被发送到单个线程,然后连接完成。通常最好先发送所有终止消息,然后再执行所有连接

我不清楚线程应该如何知道队列,尽管在某些有限的情况下,threadFuncArg可能会被滥用

Omnifarious关于适当线程池的建议更具吸引力

如果多个线程试图加入同一个线程,则某些操作系统上的行为未定义

所有的线程都需要一个互斥锁来保护,以便推回、删除和任何其他可能尝试在其上迭代的读取器

如果迭代所有_线程的其他线程可能试图在分配th之前或期间对th执行某些操作,则您可能希望在互斥保护块中包含对th的修改 这有串行化线程销毁的趋势,因为push_terminate_thread_消息被发送到单个线程,然后连接完成。通常最好先发送所有终止消息,然后再执行所有连接

我不清楚线程应该如何知道队列,尽管在某些有限的情况下,threadFuncArg可能会被滥用


Omnifarious关于适当线程池的建议更具吸引力。

问题到底是什么?这对我来说是明智的吗?你读了我的密码和呕吐物了吗?还是一种温暖、模糊的感觉?任何东西都比全球的感觉好,所以…:问题到底是什么?这对我来说是明智的吗?你读了我的密码和呕吐物了吗?还是一种温暖、模糊的感觉?任何东西都比全球的感觉好,所以…:我错过了我仍然需要分配所有线程的部分,大概是作为一个全局线程!这比我原来想象的要难看得多。@Steven Lu:将工厂设置为传递到线程中的参数。我错过了仍然需要分配所有线程的部分,大概是全局线程!这比我原来想象的要难看得多。@Steven Lu:将工厂设置为传递到线程中的参数。在设计线程池时,有什么提示/经验法则需要我记住吗?我的工厂不知道线程是否退出。我不想为了这个目的而为每个线程保留一个指向工厂的指针,对吗?重读一遍,我发现Omnifarious实际上建议了一个线程工厂,而我建议了一个池。只能在特定应用程序使用的上下文中决定哪个更好。对于池,您确实希望管理对象跟踪所有创建的线程,并在它们完成任务时为它们分配更多的工作。如果要求池关闭,它应向所有thr广播关闭消息
eads it管理,然后加入他们。如果您还不了解条件变量,在尝试创建线程池之前,请先学习/试用它们或操作系统特定的等效工具。我的工厂更像是您的池,因为我设想它跟踪已创建的所有线程。在设计线程池时,有什么提示/经验规则需要我牢记吗?我的工厂不会知道线程是否退出。我不想为了这个目的而为每个线程保留一个指向工厂的指针,对吗?重读一遍,我发现Omnifarious实际上建议了一个线程工厂,而我建议了一个池。只能在特定应用程序使用的上下文中决定哪个更好。对于池,您确实希望管理对象跟踪所有创建的线程,并在它们完成任务时为它们分配更多的工作。如果池被要求关闭,它应该向它管理的所有线程广播关闭消息,然后将它们全部加入。如果您还不了解条件变量,请在尝试创建池之前学习/试验它们或操作系统特定的等效项。我的工厂更像是您的池,因为我设想它跟踪已创建的所有线程。