2

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

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

我看到的是创建输出单例工厂并将 task_id 存储在 TLS 中。但问题是当业务逻辑创建一个新线程或线程池时,这些线程在 TLS 中不会有 task_id。这样,我将需要访问父线程 TLS。

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

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

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

output << "message";

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

4

2 回答 2

1

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

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

于 2012-12-06T16:13:28.797 回答
0

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

于 2012-12-06T16:18:15.057 回答