几个单身人士:每个任务一个

时间:2012-12-06 16:01:02

标签: c++ multithreading singleton task ssl

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

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

我看到的是在TLS中创建输出单件工厂和存储task_id。但问题是当业务逻辑创建新线程或线程池时,这些线程在TLS中不会有task_id。通过这种方式,我需要访问父级的线程TLS。

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

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

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

output << "message";

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

2 个答案:

答案 0 :(得分:1)

从应用的角度来看,他们不是单身人士,为什么要像单身人士那样对待对象呢?

我会创建一个输出存储器的新实例,并将(smart?)指针传递给新线程。 main函数可以将指针放在TLS中,从而使每个线程的实例全局化(我不认为这是一个明智的设计决策,但是它被要求)。在创建一个新的(sub - ?)线程时,可以再次传递指针。因此,据我所知,不需要单身人士或工厂。

答案 1 :(得分:0)

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