Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个单件:每个任务一个 我有一个C++多线程应用程序,它在单独的线程中运行任务。每个任务都有一个处理和存储其输出的对象。每个任务创建不同的业务逻辑对象,可能还有另一个线程或线程池_C++_Multithreading_Singleton_Task_Ssl - Fatal编程技术网

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

多个单件:每个任务一个 我有一个C++多线程应用程序,它在单独的线程中运行任务。每个任务都有一个处理和存储其输出的对象。每个任务创建不同的业务逻辑对象,可能还有另一个线程或线程池,c++,multithreading,singleton,task,ssl,C++,Multithreading,Singleton,Task,Ssl,我想做的是以某种方式为任何由任务运行的业务逻辑对象提供一种简单的方式来访问每个任务的输出,而无需手动将“output”对象传递给每个业务逻辑对象 我看到的是创建输出单例工厂并在TLS中存储任务id。但问题是,当业务逻辑创建一个新线程或线程池时,这些线程在TLS中没有任务id。这样,我就需要访问父线程TLS 另一种方法是简单地获取任务开始后的所有输出。在那个时候,会有不同任务的输出,但至少,总比没有好 我在寻找任何干净漂亮的方法来解决我的问题的建议或想法。谢谢 upd:是的,我同意,这不是单音。我

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

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

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

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

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

output << "message";

output从应用程序的角度来看,它们不是单例,那么为什么要将对象视为单例呢


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

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

多线程+单例=死亡+销毁(通常)是的,我考虑过将指针存储在新创建的线程的TLS中。但是我真的不喜欢为任务提供特殊的线程功能。你打算如何在没有TLS的情况下实现“单线程”?无论如何,我会选择通过构造函数传递引用,而不是单例,但这是我的方法。顺便说一句:使用TLS方法,你会有
output(),是的,我还认为TLS方法可能会带来很多问题和bug。因此,传递引用可能是唯一的方法。无论如何,谢谢你。顺便说一句:如果使用TLS方法,我会使用宏,并有我想要的简单用法:)事实上,我有点喜欢
output()
的方式,但祝您好运,无论您使用什么方法。不。只有在每个任务内部才有公共数据池。但在全球范围内,将有N个输出对象和N个任务。那么,输出是否在所有任务中都是通用的呢?我真的不明白你所说的“访问每个任务的输出”是什么意思。如果是这样,那么我的答案会起作用,你会把共同的输出看作“数据池”。如果不是,那么我会假设每个业务逻辑都有某种方式来理解它想要的输出部分,因此仍然可以从中得出一个共性。我希望这有帮助。如果我能更好地理解输出是什么以及某些任务的业务逻辑试图做什么,我将能够提供更多帮助。