几个单身汉:每个任务一个

Several singletons: one for each task

本文关键字:任务 一个 单身汉 几个      更新时间:2023-10-16

我有一个C++多线程应用程序,它在单独的线程中运行任务。每个任务都有一个处理和存储其输出的对象。每个任务创建不同的业务逻辑对象,可能还会创建另一个线程或线程池。

我想做的是为任务运行的任何业务逻辑对象提供一种简单的方式来访问每个任务的输出,而无需手动将"输出"对象传递给每个业务逻辑对象。

我看到的是创建输出singleton工厂并在TLS中存储task_id。但问题是,当业务逻辑创建了一个新的线程或线程池,而这些线程在TLS中没有task_id时。通过这种方式,我需要访问父线程TLS。

另一种方法是简单地获取自任务开始以来的所有输出。在那段时间里,会有不同任务的输出,但至少,总比什么都没有好。。。

我正在寻找任何干净漂亮的方法来解决我的问题的建议或想法。谢谢

upd:是的,我同意,这不是单身。我只想能够访问这样的对象:

output << "message";

就是这样。不用担心在业务逻辑类之间传递指向输出对象的指针。我需要每个任务都有一个全局输出对象。

从应用程序的角度来看,它们不是singleton,那么为什么要像对待singleton一样对待对象呢?

我会创建一个输出存储程序的新实例,并将(smart?)指针传递给新线程。主函数可能会将指针放在TLS中,从而使实例在每个线程中都是全局的(我不认为这是一个明智的设计设想,但这是有要求的)。当创建一个新的(子?)线程时,可以再次传递指针。因此,根据我的说法,不需要单身人士或工厂。

如果我理解正确,您希望有多个类实例(每个实例不一定是同一个类)都能够访问一个需要线程安全的公共数据池。我能想出几种方法来做到这一点。第一个想法是将这个数据池放在其他每个类都包含的类中。这个数据池实际上将把它的数据存储在一个静态成员中,这样即使数据池类有多个实例,也只有一个数据实例。然后,该类将具有访问此静态数据池的访问器方法(以便它是透明的)。为了确保线程安全,您需要通过互斥锁或类似的东西进行访问。