Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Multithreading 托管实例的同步_Multithreading_Design Patterns_Asynchronous_Synchronization - Fatal编程技术网

Multithreading 托管实例的同步

Multithreading 托管实例的同步,multithreading,design-patterns,asynchronous,synchronization,Multithreading,Design Patterns,Asynchronous,Synchronization,我想实现一种类(可能也称为a),它根据用户配置加载(和管理)对象(multiton中每个对象的键是配置记录的主键)。如果检测到配置中的更改,这些对象将被释放和重新创建(即重新加载) 其他对象(托管对象外部)与这些“托管”对象交互/通信 例如 ManagerA管理已配置的ClassA实例的实例。 ObjectB通过ManagerA检索ClassA的实例并启动 与实例交互 问题是ObjectB和ClassA的托管实例之间的交互可能位于另一个线程上,而不是ManagerA在该线程上处理ClassA实例

我想实现一种类(可能也称为a),它根据用户配置加载(和管理)对象(multiton中每个对象的键是配置记录的主键)。如果检测到配置中的更改,这些对象将被释放和重新创建(即重新加载)

其他对象(托管对象外部)与这些“托管”对象交互/通信

例如
ManagerA管理已配置的ClassA实例的实例。 ObjectB通过ManagerA检索ClassA的实例并启动 与实例交互

问题是ObjectB和ClassA的托管实例之间的交互可能位于另一个线程上,而不是ManagerA在该线程上处理ClassA实例并创建ClassA的新实例(用于新更改的配置)。也就是说,托管实例可以在与托管对象交互时(或之前)进行处置


我的问题是,应该如何通过外部对象同步实例管理和与这些托管实例的交互?

如果没有提供代码、psuedo代码或类似代码,这是相当困难的,但是

如果客户机通过排队操作与托管协议对象交互,并且该操作队列比托管协议对象的寿命更长,那么最好将该队列与托管协议分离,并将对类似队列的对象的引用传递给客户机

当某个对象排队时,让您的类似队列的对象签出一个正确配置的协议对象并使用它。我假设当它在使用时(意味着字节在线路上飞过),它不能被更改/配置。完成一个操作后,让类似队列的对象将协议对象签回给您的管理器。签入时,如果管理器已检测到配置中的更改,则可以处置并重新创建协议对象,如果未检测到,则管理器仍在那里,准备继续下一次使用。如果在检测到配置更改时,对象当前未签出,则可以立即执行该重新创建步骤


客户机不受这些细节的影响,因为它从不直接访问协议对象。(虽然如果这是一项要求,那么您仍然可以对协议对象应用签入和签出概念,以确保它们是最新的,但由于客户端可能忘记签入和重新签出,因此执行起来比较困难)。

简单的解决方案:不要处置()它们。无论如何,为什么需要这样做呢?托管实例实际上使用的是一次性实例,它们本身就是这样,所以它们需要被释放,否则系统资源就会泄漏或锁定,直到GC收集对象为止。例如,实例配置为与串行端口交互,作为其功能的一部分。我不必解释为什么需要从您的链接页面中解决这个问题:经理控制对Managee的所有访问,所以您不应该出现这种情况。和/或它是错误的模式。@HenkHolterman这正是我的问题:如何编写一个管理器来控制对“managee”的所有访问。使用向“managee”发送手动消息或从“managee”发送手动消息的示例并不是我在经理级别所能做的。原因是manager只是管理类似对象的实例,但不知道每个对象的特定交互(接口)。管理器使用工厂加载配置的对象,并且只要求对象实现IDisposable接口(只有托管对象的使用者知道托管对象的特定接口)。@HenkHolterman如果模式不正确,那是什么?你的方法听起来就像对每个托管对象进行锁定。我曾多次想到它,但它也有明显的问题(其中一个问题与你在文章末尾提到的相同:客户可能“忘记”解锁引用;坦率地说,它给“客户”带来了对象管理的负担)。你的部分帖子也建议使用;我现在正在尝试,看起来很有希望。另外,感谢您(以及其他任何人)尝试回答此问题。我同意,我更喜欢基于排队和完成的“操作”自动进行签入/签出的版本。但同样,没有任何psuedo代码或图表等,很难提出建议。了解客户机对象如何与协议对象交互会很有帮助(除非它确实是一个“排队”方法)。