CN109478148B - 基于工作流程的对象析构 - Google Patents
基于工作流程的对象析构 Download PDFInfo
- Publication number
- CN109478148B CN109478148B CN201780043161.0A CN201780043161A CN109478148B CN 109478148 B CN109478148 B CN 109478148B CN 201780043161 A CN201780043161 A CN 201780043161A CN 109478148 B CN109478148 B CN 109478148B
- Authority
- CN
- China
- Prior art keywords
- destruct
- thread
- objects
- workflow
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0261—Garbage collection, i.e. reclamation of unreferenced memory using reference counting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
- G06F12/0276—Generational garbage collection
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1024—Latency reduction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1032—Reliability improvement, data loss prevention, degraded operation etc
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Information Transfer Between Computers (AREA)
- Hardware Redundancy (AREA)
- Multi Processors (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
计算环境中的对象通常由线程通过对象生命周期使用,并在对象生命周期结束时被销毁以回收由对象使用的计算资源。在一些情况下,发起对象的对象析构的线程可能无法完成析构(例如第二线程可以在对象的对象资源上保持同步锁)。对象析构工作流程代表线程来发起对象的析构。如果对象析构工作流程遇到无法完成对象析构,则对对象的新引用将被插入到对象析构列表中,作为对对象的最后一个引用。第二个线程发现并释放对象析构列表中的最后的引用,提示对象析构工作流程代表第二个线程来恢复用于销毁对象的尝试。
Description
背景技术
在计算领域内,许多场景涉及存储对象集合的设备,该对象通常包括对象资源集合,诸如函数、原始数据类型、对其他对象的引用、以及诸如数组、散列表和树的数据容器。在一个或多个执行环境内执行的各种线程(例如利用不同的编程语言、执行域和/或平台)可以创建和访问对象,包括存储对相应线程当前正在使用的对象的引用(例如存储器地址或句柄)。对象可以由若干线程和/或对象同时和/或连续地访问,并且引用计数器可以用于跟踪由线程保持并存储在其他对象中的每个对象的引用的数量。在一些实例中,可以通过同步机制来实现对特定共享资源的并发访问,该同步机制确保在任意时间由一个线程对对象资源的独占访问。诸如互斥锁、信号量或临界区的同步机制可以对待处理请求进行分类;可以通过对象资源向所选线程授予独占访问,同时拒绝其他请求线程访问该对象;并且可以在向具有待处理访问请求的第二线程转移独占访问之前等待所选线程的访问完成。
当线程完成对象的使用时,它释放其引用(隐式或显式),并且引用计数减1。当针对象的引用计数减少到零时,该对象被认为不再使用并准备析构。设备可以最终确定对象的对象资源,并且可以回收由对象保留和/或消耗的存储器和计算资源。替代地,线程可以明确地请求对象的处置,并且设备可以发起完成过程,其可以包括改变由其他线程和/或其他对象保持的对对象的任意现有引用。
发明内容
提供本发明内容是为了以简化的形式介绍概念的选择,该概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键因素或必要特征,也不旨在用于限制所要求保护的主题的范围。
当线程尽力销毁对象时,可能出现一些阻止线程完成对象析构过程的情况。作为第一个这样的示例,对象可以包括由不同执行环境内的第二线程创建的对象资源,其中根据不同执行环境的约定来销毁对象资源的过程可能不完全可用于发起线程。作为第二个这样的示例,对象可以包括专门保留供第二线程使用的对象资源,诸如同步锁,并且在不毁掉第二线程,或诱导设备的不期望行为的情况下,第一线程可能无法中断提供给第二线程的独占访问。作为第三个这样的示例,该对象可以包括当前正忙的对象资源(例如可能需要一段时间才释放的资源上的资源句柄),并且阻止该线程直到该对象资源变得可用于析构可能施加并且不确定线程上的延迟。
当出现这种情况时,线程可以发起对象的析构,但是可能无法完成对象析构过程。线程可以简单地放弃处理,但是这可能使对象处于不一致状态,和/或部分销毁的对象可能无限期地持续作为资源泄漏。线程可以在稍后的时间尽力销毁对象,但是如果某些任务不能被线程执行而不管任意时间,则线程的重复尝试可能表示设备上的一致且无效的资源消耗。此外,在一些情况下,对象的析构可能需要若干线程的参与(例如不同的线程可以在对象的不同部分上保持独占访问),使得没有一个线程可以发起并且还完成对象析构过程。在这些情况下,线程无法完成对象析构过程可能难以以不协调的反复试验方式解决,而不存在各种线程可能参与的更协调的对象析构过程。
鉴于这些情况,本公开提供了促进特别是(但不排他地)在引用计数环境中由线程对对象的对象析构的技术。根据这些技术,可以通过对象析构工作流程来处理销毁对象的过程。线程可以使用用于销毁对象的请求来调用对象析构工作流程(例如响应于线程将对象上的引用计数递减为零),并且可以调用对象析构工作流程来发起对象析构。对象析构工作流程可以执行该特定对象的对象析构过程的任务(例如销毁嵌入在对象中的对象资源;回收存储器和其他计算资源;以及释放对由其他线程和对象保持的对象的任意剩余引用)。对象析构工作流程还可以验证允许请求线程执行对象析构过程的每个任务。如果对象析构完成,则对象析构工作流程可以通知该请求被完全满足的发起线程。但是,如果对象析构过程失败(例如因为发起线程被限制执行对象析构过程的至少一个任务),则对象析构工作流程可以创建对该对象的新引用,并将新引用添加到对象析构列表。因为新引用表示对对象的最后的引用,所以对象析构工作流程可以将对象的引用计数从零增加到1,指示对象当前根据引用计数语义被保留。然后,对象析构过程可以通知第一线程用于完成对象的对象析构的故障。
在稍后的时间,相同的线程或者也利用该对象的不同线程可以发现对象析构列表中对对象的最后的引用的存在。可以释放最后的引用以将对象上的引用计数从一递减到零,从而提示对象析构工作流程代表请求线程来恢复对象析构过程。第二个请求(稍后和/或由不同的线程)可以使对象析构工作流程能够完成对象析构过程,从而完全释放对象的对象资源,并提示对象析构工作流程通知请求线程对象析构的完成。根据本文所呈现的技术,以这种方式,对象析构工作流程可以处理对象析构过程的各种复杂性,并且可以封装基于工作流程的对象析构过程,该对象析构过程使得线程能够协调和互操作以实现对象的完全析构。
为了实现前述和相关目的,以下描述和附图阐述了某些示意性方面和实现。这些仅指示可以采用一个或多个方面的各种方式中的一些。当结合附图考虑时,根据以下具体实施方式,本公开的其他方面、优点和新颖特征将变得显而易见。
附图说明
图1是以线程集合为特征的示例场景的图示,所述线程共享对对象集合的访问并且尽力销毁它们。
图2是根据本文呈现的技术以线程集合为特征的示例场景的图示,该线程通过对象析构工作流程来销毁对象。
图3是根据本文呈现的技术的示例性对象析构工作流程的图示,该对象析构工作流程促进代表线程集合对对象的析构。
图4是根据本文呈现的技术以示例设备为特征的示例场景,该示例设备利用使用对象析构工作流程来销毁对象的示例系统。
图5是根据本文呈现的技术使用对象析构工作流程代表线程来销毁对象的示例方法。
图6是根据本文呈现的技术存储指令的示例计算机可读存储设备的图示,所述指令使得设备。
图7是根据本文呈现的技术的以对象的保护为特征的示例场景的图示,各种线程尽力经由对象析构工作流程来销毁对象。
图8是根据本文呈现的技术以对象析构工作流程对对象图的析构机制为特征的示例场景的图示。
图9是根据本文呈现的技术在由对象析构工作流程对对象的析构期间以将对象标记为僵尸状态的示例场景的图示。
图10是根据本文呈现的技术以由对象析构工作流程对对象的保留为特征的示例场景的图示。
图11是根据本文呈现的技术以各种机制为特征的示例场景的图示,其中第二线程恢复先前由第一线程发起的对象析构过程。
图12是示例计算环境的图示,其中可以实现本文阐述的规定中的一个或多个。
具体实施方式
现在参考附图描述所要求保护的主题,其中在全文中类似的附图标记用于指代类似的元件。在以下描述中,出于解释的目的,阐述了许多具体细节以便提供对所要求保护的主题的透彻理解。然而,显而易见的是,可以在没有这些具体细节的情况下实践所要求保护的主题。在其他情况下,以框图形式示出结构和设备,以便于促进描述所要求保护的主题。
A.简介
图1是示例场景100的图示,其中对象集合102由计算环境内的线程集合106访问,其中线程106在使用之后尽力销毁对象102。
在该示例场景100中,第一线程106在第一执行环境108内执行(例如针对设备编译的并由设备本地执行的C应用),并且第二线程106在第二不同执行环境108内执行(例如由.NET执行引擎执行的.NET应用)。相应线程106可以创建和访问分别存储对象资源集合104的各种对象102,诸如原始数据类型;对其他对象102的引用;和/或包含其他数据和/或对其他对象102的引用的数据结构,诸如函数、列表、散列表和树。线程106可以参与对象102的创建和更新,诸如用于在对象102内创建对象资源的资源创建请求110。
如图1的示例场景100中进一步示出的,线程106还可以共享对相应对象102的访问。例如在第一对象102内,第一对象资源104可以由第一线程106创建,并且可以由第二线程106访问和/或更新。在一些情况下,共享可以在没有限制的情况下发生,诸如任意数目的线程106可以自由且可同时访问的对象资源104。然而,在其他情况下,共享可以涉及同步机制,诸如对象资源锁112,其通过对象资源104向特定线程106授权独占访问。对象资源锁112可以在专用授权线程106保留对象资源锁112的持续时间期间,拒绝任意其他线程106对对象资源104的访问,并且可以记录由其他线程106的这种未实现的访问请求,可选地阻止这样的其他线程106的执行直到这样的访问可以被授予。当这样的线程106完成独占访问并释放对象资源锁112时,计算环境的组件(例如同步锁管理器)可以查看访问对象资源104的待处理请求的列表,可以选择待处理请求之一(例如根据优先级顺序),并且可以通知发起对象资源锁112的授权的所选择的请求的线程(可选地在请求待处理期间解锁线程106)。
在这样的场景中,线程106可以在对象的有用生命周期期间保留相应的对象102。在特定对象102的生命周期完成时,线程106可以寻求销毁对象102,以便回收由其利用的计算资源,诸如系统存储器、高速缓存或辅助存储器中的存储空间、以及处理器使用。对象析构过程可以显式地(例如线程106可以调用对象102上的Dispose操作)或者隐式地(例如线程106可以存储对对象102的唯一引用,以及利用引用的代码的该部分可能超出范围,导致不具有剩余引用的对象102)触发。由线程106调用的对象析构过程可以涉及销毁包括对象102的每个对象资源104,然后销毁对象102的对象容器。
另外,一些情况可以允许由第一线程106创建并且在第一线程106和第二线程106之间共享的对象102被第一线程106或第二线程106销毁。例如在图1的示例场景100中,第一线程106可以创建第一对象102和包含在其中的第一对象资源104,并且第二线程106可以发起对象析构请求114以销毁对象102。可以通过销毁对象资源104然后销毁对象102来满足该请求,并且可以向经由指示成功206的返回值来向调用对象析构请求114的第二线程106指示对象析构的成功完成。因此,线程106对对象102的析构可能因此影响也以共享方式访问对象102的另一线程106。在这种情况下,计算环境可以拒绝第一线程106的用于销毁对象102请求,或者可以通过将由第二线程106保持的对对象102的引用重置为默认值或空值来满足该请求,从而使第二线程106能够避免无效的存储器引用异常。以这种方式,线程106可以互操作以共享对对象102和包含在其中的对象资源104的访问,并且线程106可以在对象生命周期完成时为相应对象102发起并完成对象析构过程。
然而,在这种情况下,由于各种原因,发起对象析构请求114的特定线程106可能无法完成对象析构过程。
作为第一个这样的示例,对象102可以包括分别在不同执行环境108内创建的对象资源104,每个对象资源104可以利用特定约定来创建和销毁相应对象的对象资源104。在这种情况下,在特定执行环境108内执行的线程106可能不知道和/或不能调用由创建对象资源104的不同执行环境108所利用的对象资源析构过程。例如在图1的示例性场景100中,第二对象102包括由在第一执行环境108内执行的第一线程106的资源创建请求110创建的第三对象资源104,以及由在第二执行环境108内执行的第二线程106的资源创建请求110创建的第四对象资源104。第一线程106(例如C本机过程)可能无法发起第四对象资源104的析构(其由.NET执行引擎创建);类似地,第二线程106(例如C#管理的过程)可能无法发起第三对象资源104(其由C本机过程创建)的析构。因此,两个线程106都不能够发起和完成第二对象102的析构,并且由任一线程106发起的任意对象析构请求114都可能导致故障118。
作为第二个这样的示例,对象102的对象资源104可以由保持对象资源锁112的第二线程106专门使用,并且发起用于销毁对象102的请求的第一线程106可以不被允许销毁对象资源104,并因此销毁对象102,直到第二线程106完成其独占访问并放弃对象资源锁112。此外,如在图1的示例场景100所示,第三对象102包含第五对象资源104以及第六对象资源104,第二线程106为第五对象资源104保持第一对象资源锁112,第一线程106为第六对象资源104保持第二对象资源锁112。在这种情况下,两个线程106都不能由它们发起和完成对象析构请求114,并且任意这样的请求可以导致故障118。
还可能出现妨碍特定线程106完成对象102的对象析构的其他情况。作为第三示例,对象资源104可具有在对象资源104被销毁之前要满足的特定先决条件标准,诸如首先销毁相同对象102或不同的对象102的第二对象资源104;同时销毁对象102的第二对象资源104;和/或仅允许特定线程106(例如用作对象资源104的管理器的线程106)调用对象资源104的析构。作为第四示例,对象102和/或对象资源104可以涉及循环对象图,其包括以循环方式彼此引用的对象集合104,并且其中每个对象102可以仅在其他对象102被销毁之后被销毁。在没有认识到这种情况的情况下,循环对象图可能导致阻止任意对象102的析构的僵局。作为第五示例,对象资源104可能只是忙碌;例如对象资源104可以包括执行不间断过程的外部设备上的句柄,其中在完成不间断过程之前销毁对象资源104可能使损坏外部设备。尽管线程106发起针对这样的对象102的对象析构请求114以阻塞直到对象资源104可用于析构是可行的,但是这种阻塞可能导致线程106可能针对扩展且可能不确定的持续时间变得无响应。
在这种情况下,线程106无法通过对象102完成对象析构请求114可能是未预料到的,使得错误或未处理的异常导致线程106变得无响应、崩溃、或参与意外行为。在一些情况下,当线程106在处理对象析构请求114时遇到障碍时,线程106可以放弃析构任务。然而,如果计算环境缺少用于恢复并且可能完成对象102的对象析构的任意机制,则对象102可以无限期地持续作为消耗诸如存储器和处理器周期的计算资源而没有生产效果的资源泄漏。此外,当线程106部分地销毁对象102然后由于障碍而放弃析构时,对象102可能处于不一致和不确定状态,其中对象102消耗的一些资源可能不满足隐含模型,例如用于资源使用。例如计算环境可以根据引用对象102的线程106来跟踪网络使用,其中网络句柄被存储和利用。然而,计算环境可能无法预期利用网络但未被任意线程106引用的对象102的情况,并且这种意外结果可能在计算环境的其他线程106中创建意外行为,诸如不可标识的和可能无休止的网络容量消耗。在其他情况下,可以准备线程106来处理不能完成对象102的析构,但是可能无法确定对象102的对象析构为什么失败,也没有任意适当的机制来继续对象析构过程。例如线程106可以识别某个其他线程106负责销毁对象102的特定对象资源104,但是可能无法标识和/或向任意这样的其他线程106通知对象析构请求114。另一个潜在的缺点是,在某些情况下,销毁对象102的对象资源104的先决条件标准可能是复杂且细微的,使得配置任意特定线程106以处理任意特定对象102的对象析构过程的复杂性为线程106的开发者委托不期望的复杂度。此外,可能与对象资源104的析构有关的标准可能随着时间而演进(例如可以根据计算环境的新实现的环境机制来定义新标准),对特定线程106的开发者施加显著且可能过高的开发负担。这些和其他复杂性可能出现在对象102的对象资源104上的线程106的对象销毁请求114的上下文中。
B.呈现的技术
鉴于对象102的对象析构的复杂性,包括在图1的示例性场景100中示出的那些,本公开提供了在对象102的析构和在特定的地址景中用于促进线程106的技术,在特定的地址场景中第一线程106发起对象析构请求114但是不能完成对象102的对象析构。这些技术涉及将对象析构过程表示为对象析构工作流程,其封装并代表各种线程102执行特定对象102的对象析构的任务。
图2是根据本文呈现的技术呈现对象析构工作流程202的示例场景200的图示,该对象析构工作流程202销毁对象102。在该示例场景200中,在第一时间216,第一线程106发起对象析构请求114以销毁包括两个对象资源104的对象102。在该特定示例中,当第一线程106释放对对象102的、恰好是对对象102的最后的引用206的引用时,发起对象销毁。释放引用206使得对对象102的引用206的引用计数204从1递减到0,指示因为计算环境中没有线程106保留了引用206,对象102已到达对象生命周期的末尾并准备被销毁。因此,第一线程106响应于将引用计数204递减到零而发起对象102的析构。然而,线程106不是尽力自己执行对象析构,而是将对象析构请求114提交给对象析构工作流程202,对象析构工作流程202代表线程106发起对象102的析构。对象析构工作流程202通过为第一对象资源104发起对象资源析构208开始,其产生成功116。
如图2的示例性场景200中进一步所示,在第二时间218,对象析构工作流程202可以通过发起第二对象资源104的对象资源析构208来代表第一线程106继续对象102的析构,但是可能遇到故障118。例如第二对象资源104可以由保持对象资源锁112的不同线程106独占访问;可能已经由使用不同且可能未知的对象资源析构过程的不同执行环境108内的不同线程106创建;和/或可能只是忙碌,诸如等待其他资源或设备的不间断过程。响应于遇到故障118,对象析构工作流程202可以发起对对象102的新引用206的引用创建210,并将新引用206添加到对象析构列表212。对象析构列表212包括对正在被销毁的过程中的对象102的最后的引用206的存储(并且更具体地,对象102,针对对象102的对象析构过程先前由对象析构工作流程202代表至少一个线程106发起,但是其中存在防止对象析构工作流程202完成对象析构请求114的障碍)。现在包括对对象102的最后的引用206的新引用204由对象析构工作流程202插入到对象析构列表212中,并且对象析构工作流程将对象102的引用计数204从零增加到一。对象析构工作流程202还可以将故障118报告给第一线程106,第一线程106可以恢复执行,就像对象102已经被完全被销毁。
如在图2的示例性场景200中进一步示出的,在第三时间220,第二线程106可以在对象析构列表212中发现和/或被通知对对象102的最后的引用206。第二线程106可以先前已经访问过对象102(或者甚至可以创建对象102),并且因此可以发起引用206的引用释放214。引用释放214使得引用计数202从1递减到0,其中由对象析构工作流程202但是在该第三时间220,代表第二线程106而不是第一线程106重新发起对象析构请求114。对象析构工作流程202可以再次发起对象102的第二对象资源104的对象资源析构208,并且该尝试可以产生成功116(例如因为允许对象析构工作流程202代表第二线程106而不是第一线程106来销毁对象资源104)。在完成对象102的对象析构之后,对象析构工作流程202可以向第二线程106报告成功106。以这种方式,对象销毁工作流程202通过涉及根据本文呈现的技术的两个线程106的协作的迭代过程来实现对象102的对象析构。
C.技术效果
本文呈现的技术的各种用途可以产生各种技术效果。
根据本文呈现的技术可实现的第一技术效果涉及根据对象析构工作流程202的对象102的成功析构。对象析构工作流程202提供可涉及在两个或更多个连续时间的多个线程106的协作和/或一个线程106的迭代对象析构过程,作为销毁对象102的对象资源104的递增过程。这样的迭代过程可以能够实现对用于单个线程106在单个传递中对对象析构的发起和完成的广泛范围的潜在障碍的遍历,并且可以减少异常的发生、线程阻塞、导致部分删除的对象102处于不一致状态的放弃对象删除、由不完全删除的对象102引起的资源泄漏、由于不一致和可能泄漏对象102导致的线程106和/或计算环境的意外行为、不间断过程的中断、以及其中没有单个线程106能够在没有其他线程106的协作的情况下销毁对象102的网格锁定场景。
根据本文呈现的技术可实现的第二技术效果涉及对象析构工作流程202在对象析构过程中对计算环境的预先存在的资源的利用,包括可能已经在计算环境中可用的引用计数技术、以及在对象102的引用计数204递减为零时发起对象析构的自动语义。另外,对象析构列表212的使用,作为准备被销毁的对象102的引用206的存储(并且对象析构工作流程202先前尝试代表一个或多个线程106来销毁对象102导致故障118),用作线程106之间的协调机制;例如对象析构列表212中的引用206的存在用作计算环境的线程106试图销毁对象102的默认请求,并且每个这样的线程106的尝试最终可以导致完成或至少进行对象102的析构的成功116。因此,已经被配置为利用引用206的线程可以能够参与由对象析构工作流程202调解的增量对象析构过程,而无需重新配置或开发人员对这些技术的语义和机制的任何认知。
根据本文呈现的技术可实现的第三技术效果涉及代表线程106在处理对象析构时的开发复杂性的降低。从线程106到对象析构工作流程202的对象析构的细节和机制的委托使得线程106能够忽略对象析构过程的进展和复杂性;例如线程106不需要被配置为处理故障118,其各种原因,和/或向其他线程106的请求的通信以进一步尝试销毁对象102。对象析构工作流程202甚至可以自动化稍后由相同的线程106重新开始对象102的析构的过程,而不是线程106后来承担重新发起尝试的责任。每个线程106可以简单地配置为发起对象析构请求114,然后在对象析构完成之前继续处理,甚至与初始对象析构请求114的结果无关。因此,对象析构工作流程202通过以下各项促进线程106的效率:减少参与对象析构过程的线程阻塞和/或复杂性,并使线程106能够恢复生产处理,同时在其他地方处理对象析构。
根据本文呈现的技术可实现的第四技术效果涉及对象析构过程的复杂性。通过封装对象析构的细节,对象析构工作流程202可以被配置为处理要销毁的各种对象102和对象资源104;可能使其析构复杂化的各种各样的情况;以及用于促进对象102和对象资源104的特定类型和情况的处理的各种各样的技术。
图3是以示例对象析构工作流程202为特征的示例场景300的图示。在该示例场景300中,对象析构工作流程202被公式化为代表两个线程106对特定对象102的对象析构,特定对象102以健壮的对象资源集合104为特征。该示例对象析构工作流程202被表示为要在对象102上执行的任务集合302,诸如将对象102标记为待处理析构,以及销毁特定资源102。此外,相应任务302与一个或多个任务标准304相关联,诸如在发起任务302之前要满足的一个或多个先决条件(例如首先完成对另一个对象资源104的销毁的先决条件),和/或可以执行任务302的情况(例如对象销毁工作流202可以代表其执行任务302的线程类型106的标识,和/或与第一对象资源104同时被销毁的第二对象资源104的标识)。对象析构工作流程202还可以包括指示任务302是否已经完成的相应任务302的状态指示符集合306。对象析构工作流程202的一些任务302可以与其他任务302同时执行和/或以任何连续顺序执行(例如第一对象资源104和第二对象资源104的析构可以同时执行,和/或以连续顺序执行),而其他任务302可以指定强制执行特定连续顺序和/或并发的标准304。
当特定线程106将对象102的引用计数204从1减少到零时,线程106可以发起对象析构请求114。对象析构工作流程202可以通过检查任务列表302来响应,以及相应的任务标准304和状态指示符306,以标识有资格代表线程106执行的一个或多个任务302。然后,对象析构工作流程202可以代表线程106执行所标识的任务302,要么直到任务302完成(使得对象析构成功116),要么直到没有其他任务302有资格代表该线程106执行,此时对象析构工作流程202将对对象102的新的引用206(作为最后的引用206)插入到对象析构列表212中,作为用于在稍后的时间并且可能代表不同线程106来恢复对对象102的对象析构的机制。以这种方式,对象析构工作流程202可以在对象资源104和对象102析构时启用并遵守任务302和任务标准304的健壮的集合。许多这样的技术效果可以是通过根据本文呈现的技术使用对象析构工作流程202的对象102的析构可实现的。
D.示例实施例
图4呈现了示例性场景400的图示,其以本文呈现的技术的示例实施例为特征,示出为根据本文呈现的技术销毁对象102的示例设备402。在该示例场景400中,设备402包括处理器404,其例如代表设备302的各种应用和/或计算环境来执行线程集合106。设备402还包括存储指令的存储器406,该指令当由处理器404执行时实现示例系统408,示例系统408根据本文呈现的技术代表线程106销毁对象102。
示例系统408包括对象析构列表212,其存储对待销毁的对象102(并且更具体地,针对对象析构待处理的对象102,在至少一次先前尝试代表至少一个线程106销毁对象102导致失败118之后)的引用206。示例系统408还包括对象析构工作流程202,其由处理器304代表第一线程106执行。对象析构工作流程202通过尝试销毁对象102(例如通过执行各种任务302,诸如销毁对象102的个体对象资源104),响应释放对对象102的最后的引用206(例如将引用计数从一递减为零)。响应于完成对象102的对象析构的失败118,对象析构工作流程202将对对象102的新的引用206添加到对象析构列表212,其中新引用206表示对对象102的最后的引用206。创建新引用206还可以提示将对象102的引用206的引用计数204从零增加到一。此外,代表第一线程106、添加代表第二线程106的对象析构工作流程202通过释放对对象102的最后的引用206,响应对象析构列表212中对对象102的最后的引用206的标识。这种释放依次代表第一线程106用对象102的对象析构请求114调用对象析构工作流程202,这可以导致对对象102的对象析构的成功116(或至少进展)。以这种方式,图4的示例设备402和示例系统406根据本文呈现的技术使用对象析构工作流程202来促进对象102的析构中的线程106。
图5是根据本文呈现的技术通过对象析构工作流程202的使用代表线程106来析构对象102的示例方法500的图示。示例方法500涉及包括处理器404的设备,并且可以被实现为例如存储在诸如存储器电路、硬盘驱动器的盘片、固态存储设备、或磁盘或光盘的设备的存储器组件中的指令集合,并且被组织成使得当在设备的处理器上执行时,使得设备根据本文呈现的技术进行操作。
示例方法500开始于502并且涉及在设备的处理器404上执行504对象析构工作流程202。具体地,对象析构工作流程202的执行生成506对象析构列表212,其存储对要析构的对象102的引用206。代表508第一线程106并且响应于释放对第一线程106访问的对象102的最后的引用206的对象析构工作流程202的执行进一步尝试510销毁对象102;并且响应于用于完成对象102的析构的故障118,进一步向对象析构列表212添加512对对象102的新的引用206,作为对对象102的最后引用206,其中在对象销毁列表212中包括对对象102的最后引用206提示其他线程106(可选地包括第一线程106)尝试销毁对象102。在代表线程102实现对对象102的对象销毁之后,示例方法500根据本文呈现的技术实现对象销毁工作流程202和对象销毁列表212,并且因此在514处结束。
又一实施例涉及一种包括处理器可执行指令的计算机可读介质,所述处理器可执行指令被配置为应用本文呈现的技术。这样的计算机可读介质可以包括各种类型的通信介质,诸如可以通过各种物理现象传播的信号(例如电磁信号、声波信号或光信号)以及各种有线场景(例如经由以太网或光纤电缆)和/或无线场景(例如无线局域网(WLAN),诸如WiFi、诸如蓝牙的个人局域网(PAN)、或蜂窝或无线电网络),以及编码计算机可读指令集合,计算机可读指令集合当由设备的处理器执行时,使得该设备实现本文呈现的技术。这样的计算机可读介质还可以包括(作为排除通信介质的一类技术)计算机-计算机可读存储器设备,诸如存储器半导体(例如利用静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、和/或同步动态随机存取存储器(SDRAM)技术的半导体)、硬盘驱动器的盘片、闪存设备或磁盘或光盘(诸如CD-R、DVD-R或软盘),编码计算机可读指令集合,该计算机可读指令集合当由设备的处理器执行时,使得该设备实现本文呈现的技术。
可以以这些方式设计的示例计算机可读介质在图6中示出,其中实现600包括计算机可读存储器设备602(例如CD-R、DVD-R或硬盘驱动器的盘片),其上是编码的计算机可读数据604。该计算机可读数据604进而包括计算机指令集合606,计算机指令集合606当在设备610的处理器404上执行时,使设备610根据本文阐述的原理进行操作。在第一个这样的实施例中,处理器可执行指令606可以使设备的配置能够使用根据本文呈现的技术的对象析构工作流程202来销毁对象102,诸如图1的示例场景400中的示例设备402。在第一个这样的实施例中,处理器可执行指令606可以提供一种系统,该系统当由设备执行时,使得设备使用根据本文呈现的技术的对象析构工作流程202来销毁对象102,诸如图4的示例场景400中的示例系统408。在第三个这样的实施例中,计算机可读存储设备602的处理器可执行指令606可以提供使得设备使用根据本文呈现的技术的对象销毁工作流程202来销毁对象102的方法608,诸如图5的示例方法500。本领域普通技术人员可以设计许多这样的被配置为根据本文呈现的技术进行操作的计算机可读介质。
E.变体
可以在许多方面进行变体来设计本文所讨论的技术,并且一些变体可以提供额外的优点和/或减少关于这些和其他技术的其他变体的缺点。此外,一些变体可以组合实施,并且一些组合可以通过协同合作而具有额外的优点和/或减少的缺点。这些变体可以并入各种实施例中(例如图4的示例设备400和/或示例系统408;图5的示例方法500;和/或图6的示例计算机可读存储设备602)以在这些实施例中赋予个体和/或协同优点。
E1.场景
可以在本文呈现的技术的实施例之间改变的第一方面涉及可以利用这些技术的场景的范围。
作为该第一方面的第一变体,本文呈现的技术可以与各种设备一起使用,诸如工作站;膝上型计算机;平板计算机;移动电话;游戏机和便携式游戏设备;便携式或非便携式媒体播放器;媒体显示设备,诸如电视机、电器;家用电器和自动化设备;和集成了诸如眼镜或手表的可穿戴设备的计算组件。
作为该第一方面的第二变体,本文给出的技术可以与各种线程106一起使用,诸如GUI驱动、控制台驱动和/或无UI应用;服务和守护进程;设备驱动程序;和实际或虚拟化的操作系统过程,诸如内核过程和文件系统过程。各种线程和线程调度模型可以与本文呈现的技术兼容。线程106可以在各种类型的执行环境108内执行,诸如以机器语言提供并由处理器404直接执行的本机执行环境108;由特定运行时环境中的运行时执行的托管应用;在虚拟机中执行的虚拟化应用,诸如Web浏览器;和由解释器执行的脚本。另外,许多类型的对象102和对象资源104可以被管理并且特别地被本文呈现的技术销毁,包括无类型和/或轻度类型对象的轻量级集合(例如键/值存储,诸如JSON对象)和严格组织和类型化的对象(例如具有继承和多态类型的基于类的对象的深层次结构)。还可以调用对象析构工作流程202以销毁设备402的计算环境内的任意对象102;仅对于对象析构呈现复杂性的对象102,诸如由多个线程106和/或执行环境108共享的对象102;和/或仅针对线程106已尝试发起并完成对象析构过程并且遇到了故障118的对象102。
作为该第一方面的第三变体,可以利用许多类型的对象析构工作流程202。作为第一个这样的示例,工作流程模式通常用于各种计算环境中的许多类型的任务,并且许多这样的工作流程应用于资源密集型和计算上昂贵的过程,诸如完成数据库事务所涉及的复杂步骤。本文呈现的对象析构工作流程202被用作用于组织对象102的析构的模式,并且可以适用于各种各样的对象102,包括响应于单个对象析构请求114通常可销毁的相对轻量级的对象(但是可能在异常情形下遇到复杂情况,诸如由不同线程106进行独占锁定),以及复杂对象102,其存储具有详细任务标准304的健壮对象资源集合104,诸如图3的示例场景300中所示。广义对象析构工作流程202还可以缩放以促进大范围的这样的对象102的析构,例如由健壮的应用利用的整个对象102的集合,其中这样的对象102包括通常易于销毁的轻量级对象102和在其析构中呈现广泛任务标准304的复杂对象102。本文呈现的技术可以适用于与各种对象类型和复杂性一起使用。
作为第二个这样的示例,对象析构工作流程202可以包括设备402的操作系统的组件;由这种设备402的平台或架构特征提供的一个或多个运行时的组件;和/或安装在设备402上的运行时库,其可以被所有线程106访问以用于任意对象102的析构,和/或可以被提供用于线程106和/或对象102的特定集合(例如Web浏览器组件,其促进Web应用程序利用的对象102的对象析构)。对象析构工作流程202还可以促进在设备402的集合上执行的分布式线程集合106,诸如在包括服务器场的服务器集合上分布的线程集合106,和/或可以被调用以管理在各种设备上分布的对象102的对象析构,诸如由各种对象服务器存储和/或利用的共享对象集合。作为第三个这样的示例,对象析构工作流程202可以嵌入在由对象析构工作流程202管理的一个或多个对象102中;相反,对象析构工作流程202可以封装由此管理的对象102;和/或对象析构工作流程202和对象102可以独立存在,和/或在共享上下文中存在,诸如一个或多个线程106的运行时环境。作为第四个这样的示例,线程106和对象析构工作流程202之间的关系和/或接口可以以各种方式定义。例如对象析构工作流程202可以包括代表线程106来处理对象的对象析构的管理器;作为线程106可以调用以协助对象102的对象析构的服务;和/或作为脚本、资源工具包、或函数库,线程106可以引用和/或利用其来执行一个或多个对象102的对象析构的个体任务302。线程106还可以将各种功能委托给对象析构工作流程202;例如线程106和/或执行环境108可以展露λ表达式、函数或回调,对象析构工作流程202可以调用其以便请求线程106参与在对象102的对象析构中涉及的任务302。
作为该第一方面的第四变体,可以利用许多类型的对象析构列表212。作为第一个这样的示例,对象析构列表212可以实现为许多类型的数据结构,包括阵列;链表;队列;无序的集合;表,诸如散列表;和树结构。作为第二个这样的示例,对象析构列表212可以被实现为全局对象析构列表212,其存储对计算环境的、要被析构的任意对象102的最后的引用206。替代地,可以提供一个或多个对象析构列表212,其中每个对象析构列表212存储对特定类型的对象102的最后的引用206,诸如特定对象类型的对象102,和/或在所选上下文内利用的对象102;所选择的线程106利用的对象102,诸如特定编程语言和/或执行环境108的线程106;和/或存储特定对象资源集合104的对象102,诸如特定对象资源类型104的对象资源104。作为第三个这样的示例,对象析构列表212可以存储各种类型的最后的引用206,诸如到所标识的对象102被存储的位置的存储器指针,或对象102的唯一标识符,诸如对象102的全局唯一标识符(GUID)和/或统一资源标识符(URI)。可选地或另外地,对象析构列表212可以存储对特定对象资源104的引用206,该特定对象资源104在销毁包括和/或引用这样的对象资源104的一个或多个对象102的过程中将被销毁。许多这样的计算场景变体和架构变体可以适合于对象析构工作流程202的使用以根据本文呈现的技术促进对象102的析构。
E2.对象析构工作流程
可以在本文呈现的技术的实施例之间变化的第二方面涉及对象析构工作流程202,线程106利用该对象析构工作流程202来实现计算环境的各种对象102的对象析构。
作为该第二方面的第一变体,可以特别地生成对象析构工作流程202,以便处理特定对象102的对象析构,和/或处理特定线程106对对象102的析构。替代地,可以生成对象析构工作流程202以代表任意线程106处理计算环境内的任意对象102的析构,或者处理由特定线程子集106使用的对象102的特定子集。作为一个这样的示例,计算环境可以以涉及线程106的集合的上下文为特征,线程106在特定的对象集合102上互操作,诸如特定服务、平台、库和/或应用中涉及的线程106和对象102。另外,对象析构工作流程202可以包含关于对象102和/或对象102的对象析构中涉及的线程106的各种类型的信息。作为一个这样的示例,对象析构工作流程可以针对特定对象102标识已经访问和/或可以访问特定对象102的线程集合106。这种信息的存储可以使对象析构工作流程202能够特别是向已经访问和/或可以访问对象102的线程106发出关于特定对象102的析构的通知,例如以便通知它们对象102的对象析构的进度和/或请求这些线程106参与对象析构。另外,对象析构工作流程202可以包括可以适用于各种对象102的各种类型的信息析构过程,诸如涉及对象102的析构的任务302、可应用于其的任务标准304和/或对象析构中的相应任务302的状态306。
作为该第二方面的第二变体,可以以各种方式发起对象析构工作流程202对对象102的对象析构。作为第一个这样的示例,线程106可以发起显式对象析构请求114,诸如调用处置指令或处置接口用于对象102的处置。作为第二个这样的示例,线程106可以发起隐式对象析构请求,诸如释放对对象102的引用206,其恰好包括对象的最后的引用206并且提示将引用计数204从一个递减到零,或者关闭包含对对象102的最后的引用206的线程106的范围。作为第三个这样的示例,线程106可以自终止,和/或可以由另一个线程106终止,并且线程106的终止可以包括释放由线程106保存的对对象102的最后的引用206。
作为该第二方面的第三变体,对象析构工作流程202在代表发起对象析构请求114的第一线程106执行对象102的对象析构时,可能遇到代表第一线程106来阻止对象析构的完成的多种类型的障碍。作为第一个这样的示例,对象析构工作流程202可以发现对象102的所选部分与第二线程106的对象析构过程相关联(例如第二线程106的执行环境108利用的对象析构约定,诸如第二线程106的编程语言和/或平台的约定),并且在确定对象102的所选部分与要在第二线程106内调用的对象析构过程相关联时可能遇到故障118。作为第二个这样的示例,对象析构工作流程202可以发现对象102的对象资源104经由对象资源锁112由不同的线程106独占保持,第一线程106和对象析构工作流程202都不能够中断对象资源锁112。作为第三个这样的示例,对象析构工作流程202可以确定对象102的对象资源104处于忙碌状态(例如使用外部设备执行不间断过程的设备句柄,其中对象资源104的析构在不间断过程期间可能导致对外部设备的数据损坏或毁坏)。作为第四个这样的示例,对象析构工作流程202可以简单地发现发起对象讨论请求114的第一线程106不具有销毁对象102的许可。在对象析构工作流程202的对象析构期间可能出现许多这样的障碍。
图7是以第二方面的第四变体为特征的示例场景700的图示,其中对象析构工作流程202允许将对象102被标记为仅由所选择的线程106可销毁的受保护对象,并且其中对象析构工作流程202拒绝由任意其他线程106发起的对象析构请求114。在该示例场景700中,特定对象102被标记为702作为受保护对象,其可以仅在第二线程106的请求时被销毁。在第一时间704,第一线程106例如通过尝试将引用计数204从1递减到零来发起对象析构请求114。然而,对象析构工作流程202确定对象102被标记以防止第一线程106的对象析构,并且因此拒绝第一线程106的对象析构请求114(包括拒绝允许第一线程106将引用计数204从1递减到0,和/或执行对象析构列表212中的最后的引用206的引用释放214),并且将对象析构请求114的故障118返回到第一线程106。在第二时间706处,对象析构工作流程202从第二线程106接收对象析构请求202,并验证对象102的标记702允许第二线程106发起对象析构。因此,对象析构工作流程202执行对象析构列表212中的最后的引用206的引用释放214,将引用计数204从一递减到零,并且报告至少发起对象102的对象析构请求114的成功116。
图8呈现了以第二方面的第五变体为特征的示例性场景800的图示,其涉及形成引用循环的对象102的循环对象图802,其分别包含对对象图802的其他对象102的引用206。当对象析构工作流程202从线程106接收到用于销毁循环对象图802的对象102的对象析构请求114时,对象析构工作流程202可能遇到困难,因为对象102中没有一个能够在没有首先销毁循环对象图802的一个或多个其他对象102的情况下被完全销毁,该循环对象图802存储对在对象析构请求114中标识的对象102的引用206。因此,由于对象102的相互关系,包括循环对象图802的对象102的整个集合可以持续超出任何或所有对象102的生命周期。为了解决该问题,对象析构工作流程202可以在循环对象图802的整个对象102的集合上提供同步机制804(例如对所有对象102的独占锁定)。在接收到用于销毁循环对象图802的一个、几个或所有对象的对象析构请求114时,对象析构工作流程202可以首先经由同步机制804确保对循环对象图802的对象102的独占访问。然后,对象析构工作流程202可以根据析构序列806发起对象102的对象析构(例如以特定顺序来销毁对象102)。值得注意的是,可以执行每个对象102的对象析构,而不管由循环对象图802的其他对象102保持的对对象102的引用206,因为由对象析构工作流程202保持的同步机制804排除任意其他线程106访问对象102并且可能遇到对先前被销毁的对象102的无效引用206。对象析构工作流程202可以保留同步机制804,直到循环对象图802上的析构序列806完成并且所有这样的对象102已经被销毁,从而能够实现循环对象图802的析构。
图9呈现了以第二方面的第六变体为特征的示例性场景900的图示,其中对象析构工作流程202标记已经发起但尚未完成的对象析构的对象102,如用僵尸状态标记。在该示例场景900中,在第一时间908,第一线程106发起对象析构请求114以销毁特定对象102,并且对象析构工作流程202发起对象析构102。在发起对象析构时,对象析构工作流程202可以向对象102应用僵尸状态902的标记,向其他线程106指示对象102的对象析构正在进行中。响应于遇到故障118以完成对象102的对象析构,对象析构工作流程202执行引用创建210,将对对象102的新的引用206添加到对象析构列表212作为对对象102的最后的引用206,并且将引用计数204从0增加到1。然后,对象析构工作流程202等待另一个线程106恢复对象析构过程。然而,在这样的对象析构完成之前的第二时间910,第二线程106可以在对象102上发起访问请求904,诸如用于将数据存储在对象102中的请求。将对象102标记为僵尸状态902可以导致向第二线程106生成指示对象102的僵尸状态902的警告906,并且警告从对象102读取的和/或写入对象102的数据可能不准确、不是当前的和/或无效的,和/或在对象析构期间可能丢失。以这种方式,对象析构工作流程202在对象析构的未决期间保护对象102不被其他线程106访问,以可能在对象析构期间从线程106无意中访问对象102而导致的异常、不一致行为和/或数据丢失的减少。对象析构工作流程202可以利用许多这样的技术来根据本文呈现的技术执行对对象102的对象析构。
E3.对象析构列表
可以在本文呈现的技术的实施例之间变化的第三方面涉及对象析构工作流程202对对象析构列表212的使用以存储对待销毁的对象102的引用206(并且更具体地,针对其至少一个线程106已经发起导致故障118的对象析构请求114)。
图10是以该第二方面的第一变体为特征的示例性场景1000的图示,其中对象析构工作流程202使对象102能够用保留状态1002标记,使得对象102将被保留甚至超出任意线程106中的最后的引用的引用释放214。例如对象102可以包括运行时库或服务的实例,该实例将保持可用于计算环境的线程106,即使没有线程106是当前正在使用对象102时。在该示例场景1000中,存储对对象102的最后的引用206的线程106发起用于释放最后的引用206的对象析构请求114,将引用计数204从1递减到0,并且销毁对象102。然而,对象析构工作流程202将对象102标识为已被标记为保留对象1002,针对其最后一个引用206被保留而不是被释放。因此,对象析构工作流程202可以报告故障118以递减引用计数204,释放最后的引用206,和/或销毁对象102。相反,对象析构工作流程202可以将最后的引用206存储在对象析构列表中212,但是可以拒绝各种线程106的请求以释放最后的引用206和/或将引用计数204从1递减到0。因此,对象析构流程202使用对象析构列表212作为保留对象高速缓存,保留对象高速缓存存储对保留对象102的高速缓存引用206,从而确保在将标记保留为保留对象1002的同时对象102不被销毁。此外,当保留对象高速缓存存储对保留对象1002的高速缓存引用206时,对相应线程内的保留对象1002的其他引用206被标记为对保留对象1002的弱引用,并且不被引用计数204跟踪。响应于用于移除对象102作为保留对象1002的标记的请求,对象析构工作流程202可以将线程106内的任意引用206改变为强引用206(并且可以相应地递增引用计数204),使得所有这些引用的释放204调用对象102的对象析构。
作为该第三方面的第二变体,线程106和对象析构工作流程202可以以各种方式交互以关于对象析构列表212进行通信,包括向对象析构列表212添加对对象102的引用206,各种线程106可以针对对象析构列表212发起对象析构请求114。
图11呈现了以两种这样的技术为特征的示例性场景1100的图示,由此线程106和对象析构工作流202利用对象析构列表212来协调对象102的对象析构。作为第一个这样的示例1106,第一线程106可以发起对象析构请求114,在此期间对象析构工作流程202可能遇到故障118,提示对象析构工作流程202将新的引用206添加到对象析构列表212作为对象102的最后的引用。另外,响应于将对对象102的新引用206添加到对象析构列表212,对象析构工作流程202还可以通知第二线程106还访问关于将对对象102的新引用206添加到对象析构列表212的对象102。通知1102可以提示第二线程106释放最后的引用206,通过其提示对象析构工作流程202代表第二线程106重新发起对象析构过程。
在该变体中,可以利用许多技术,由此对象析构工作流程202将第二线程106标识为通知1102的接收者。作为第一个这样的示例,通知1102也可以在接收到对对象102的最后的引用206时,由对象析构工作流程202和/或由对象析构列表212发起。作为第二个这样的示例,第二线程106还可以包括高于第一线程106并且共享对对象106的访问的上级线程106(例如管理第一线程106的管理运行时的线程),并且对象析构工作流程202可以向上级线程106通知将对对象102的新引用206添加到对象析构列表212。作为第三个这样的示例,对象析构工作流程202可以在由处理器执行的线程106的线程集合中进行搜索,以将第二线程标识为若干个线程之一,其可以访问和/或当前访问或先前访问过对象102。作为第四个这样的示例,可以以各种方式将通知1102传递给第二线程106。例如第二线程106还可以包括要传递给第二线程106的消息的消息队列,并且对象析构工作流程202可以将通知1102插入到第二线程106的消息队列中,其中该消息向第二线程106通知将对对象102的新引用206添加到对象析构列表212。作为第五个这样的示例,如果要向其传递通知1102的第二线程106处于挂起状态,则对象析构工作流程202可以激活第二线程106以处理通知1102并继续对象102的对象析构。
图11还示出了线程106和对象析构列表212之间的交互的第二示例1108,其中相应线程106周期性地查看对象析构列表212以标识对由线程106当前和/或已经访问的对象102的引用206的存在。在该第二示例1108中,第一线程106可以发起对象析构请求114,在此期间对象析构工作流程202可能遇到故障118,提示对象析构工作流程202向对象析构列表212添加新引用206作为对对象102的最后的引用。第二线程106可以轮询1104对象析构列表212,并且在发现对对象102的最后的引用206时,可以确定对象102当前和/或已经由第二线程102访问。响应于确定第二线程106与对象102具有这样的关系,第二线程106可以从对象析构列表212移除对对象102的最后的次引用206并执行最后的引用206的引用释放214,从而代表第二线程106来发起对象析构工作流程202的恢复。线程106和对象析构工作流程202可以利用许多这样的技术来根据本文呈现的技术在其中传送关于对象102的对象析构过程。
F.计算环境
图12和以下讨论提供了用于实现本文阐述的一个或多个规定的实施例的合适计算环境的简要、一般描述。图12的操作环境仅是合适的操作环境的一个示例,并不旨在启示对操作环境的使用范围或功能提出任意限制。示例计算设备包括但不限于个人计算机、服务器计算机、手持或膝上型设备、移动设备(诸如移动电话、个人数字助理(PDA)、媒体播放器等)、多处理器系统、消费电子产品、小型计算机、大型计算机、包括上述系统或设备中的任意一个的分布式计算环境等。
尽管不是必需的,但是在由一个或多个计算设备执行的“计算机可读指令”的一般上下文中描述了实施例。计算机可读指令可以经由计算机可读介质(下面讨论)分发。计算机可读指令可以实现为执行特定任务或实现特定抽象数据类型的程序模块,诸如功能、对象、应用程序编程接口(API)、数据结构等。通常,计算机可读指令的功能可以根据需要在各种环境中组合或分布。
图12示出了包括计算设备1202的系统1200的示例,该计算设备1202被配置为实现本文提供的一个或多个实施例。在一种配置中,计算设备1202包括至少一个处理单元1206和存储器1208。根据计算设备的确切配置和类型,存储器1208可以是易失性的(例如诸如RAM)、非易失性的(例如诸如ROM、闪存等)、或两者的某种组合。该配置在图12中由虚线1204示出。
在其他实施例中,设备1202可以包括附加特征和/或功能。例如设备1202还可以包括附加存储装置(例如可移动和/或不可移动),包括但不限于磁存储装置、光存储装置等。这种附加存储装置在图12中由存储装置1210示出。在一个实施例中,用于实现本文提供的一个或多个实施例的计算机可读指令可以在存储装置1210中。存储装置1210还可以存储其他计算机可读指令以实现操作系统、应用程序等。例如计算机可读指令可以加载到存储器1208中以供处理单元1206执行。
本文使用的术语“计算机可读介质”包括计算机可读存储器设备,其排除包括诸如信号的通信介质的其他形式的计算机可读介质。这样的计算机可读存储器设备可以是易失性的和/或非易失性的、可移动的和/或不可移除的,并且可以涉及存储计算机可读指令或其他数据的各种类型的物理设备。存储器1208和存储装置1210是计算机存储介质的示例。计算机存储存储设备包括但不限于RAM、ROM、EEPROM、闪存或其他存储技术、CD-ROM、数字通用盘(DVD)或其他光存储器、磁带盒、磁带和磁盘存储装置或其他磁存储设备。
设备1202还可以包括允许设备1202与其他设备通信的通信连接1216。通信连接1216可以包括但不限于调制解调器、网络接口卡(NIC)、集成网络接口、射频发送器/接收器、红外端口、USB连接或用于将计算设备1202连接到其他计算设备的其他接口。通信连接1216可以包括有线连接或无线连接。通信连接1216可以发送和/或接收通信介质。
术语“计算机可读介质”可以包括通信介质。通信介质通常以诸如载波或其他传输机制的“调制数据信号”来体现计算机可读指令或其他数据,并且包括任意信息传递介质。术语“已调制数据信号”可以包括以对信号中的信息进行编码的方式设置或改变其特征中的一个或多个的信号。
设备1202可以包括输入设备1214,诸如键盘、鼠标、笔、语音输入设备、触摸输入设备、红外相机、视频输入设备和/或任意其他输入设备。诸如一个或多个显示器、扬声器、打印机和/或任意其他输出设备的输出设备1212也可以被包括在设备1202中。输入设备1214和输出设备1212可以经由有线连接、无线连接或其任意组合来连接到设备1202。在一个实施例中,来自另一计算设备的输入设备或输出设备可以用作计算设备1202的输入设备1214或输出设备1212。
计算设备1202的组件可以通过诸如总线的各种互连来连接。这种互连可以包括外围组件互连(PCI),诸如PCI Express、通用串行总线(USB)、Firewire(IEEE 1394)、光学总线结构等。在另一个实施例中,计算设备1202的组件可以通过网络互连。例如存储器1208可以包括位于由网络互连的不同物理位置的多个物理存储器单元。
本领域技术人员将认识到,用于存储计算机可读指令的存储设备可以跨网络分布。例如经由网络1218可访问的计算设备1220可以存储计算机可读指令以实现本文提供的一个或多个实施例。计算设备1202可以访问计算设备1220并下载部分或全部计算机可读指令以供执行。替代地,计算设备1202可以根据需要下载计算机可读指令的片段,或者一些指令可以在计算设备1202处执行而一些指令可以在计算设备1220处执行。
G.术语的使用
尽管用结构特征和/或方法动作专用的语言描述了本主题,但应理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。相反,公开了上述具体特征和动作作为实现权利要求的示例形式。
如在本申请中所使用的,术语“组件”、“模块”、“系统”、“接口”等通常旨在指代与计算机相关的实体,要么是硬件、硬件和软件的组合、软件、或执行中的软件。例如组件可以是但不限于是在处理器上运行的过程、处理器、对象、可执行文件、执行的线程、程序和/或计算机。作为说明,在控制器上运行的应用和控制器都可以是组件。一个或多个组件可以驻留在过程和/或执行的线程内,并且组件可以位于一个计算机上和/或分布在两个或更多个计算机之间。
此外,所要求保护的主题可以使用标准编程和/或工程技术实现为方法、装置或制品,以产生软件、固件、硬件或其任意组合以控制计算机实现所公开的主题。本文使用的术语“制品”旨在涵盖可从任意计算机可读设备、载体或介质访问的计算机程序。当然,本领域技术人员将认识到,在不脱离所要求保护的主题的范围或精神的情况下,可以对该配置进行许多修改。
本文提供了实施例的各种操作。在一个实施例中,所描述的操作中的一个或多个可以构成在一个或多个计算机可读介质上存储的计算机可读指令,其如果由计算设备执行,则将导致计算设备执行所描述的操作。描述操作中的一些或所有的顺序不应被解释为暗示这些操作必须依赖于顺序。受益于本说明书的本领域技术人员将理解替代排序。此外,应该理解,并非所有操作都必须存在于本文提供的每个实施例中。
本文中描述为“示例”的任意方面或设计不一定被解释为比其他方面或设计有利。相反,使用词语“示例”旨在呈现可能与本文呈现的技术有关的一个可能的方面和/或实现。这些示例对于这些技术不是必需的或者旨在是限制性的。这些技术的各种实施例可以包括这样的示例,单独或与其他特征组合,和/或可以改变和/或省略所示示例。
如在本申请中所使用的,术语“或”旨在表示包含性的“或”而不是排他性的“或”。也就是说,除非另有说明或从上下文中是清楚的,否则“X采用A或B”旨在表示自然的包含性排列中的任意一个。也就是说,如果X采用A;X采用B;或者X采用A和B两者,则在前述情况中的任意一个下满足“X采用A或B”。另外,本申请和所附权利要求中使用的冠词“一”和“一个”通常可以解释为表示“一个或多个”,除非另有说明或从上下文清楚地指向单数形式。
此外,尽管已经相对于一个或多个实现示出并描述了本公开,但是本领域技术人员基于对本说明书和附图的阅读和理解,将想到等同的改变和修改。本公开包括所有这些修改和改变,并且仅受所附权利要求的范围限制。特别地,关于由上述组件(例如元件、资源等)执行的各种功能,除非另有说明,否则用于描述这些组件的术语旨在与执行所述组件的指定功能的任意组件相对应(例如即在功能上等同的),即使在结构上不等同于在本公开的示例实现中所示的、执行本文中的功能的所公开的结构。另外,尽管可能仅关于若干实现中的一个公开了本公开的特定特征,但是这样的特征可以与其他实现的一个或多个其他特征组合,如对于任意给定或特定应用可能是期望和有利的。此外,在详细说明或权利要求中使用术语“包括”、“具有”、“包含”、“含有”或其变体的方面而言,这些术语旨在以类似于术语“包括”的方式被包括在内。
Claims (20)
1.一种销毁设备的引用计数环境内的对象的设备,所述设备包括:
处理器,以及
存储器,存储:
对要被销毁的对象的引用的对象析构列表;以及
由所述处理器执行的、代表第一线程的对象析构工作流程:
响应于释放对由所述第一线程访问的对象的最后的引用:
试图销毁所述对象;以及
响应于未能完成所述对象的析构,将对所述对象的新引用添加到所述对象析构列表,作为对所述对象的所述最后的引用;以及
响应于针对所述对象由第二线程标识被添加到所述对象析构列表的所述对象的所述最后的引用,释放对所述对象的所述最后的引用。
2.根据权利要求1所述的设备,其中:
所述对象的选择的部分与所述第二线程的对象析构过程相关联;以及
未能完成所述对象的所述析构还包括:确定所述选择的部分与所述第二线程内要被调用的所述对象析构过程相关联。
3.根据权利要求1所述的设备,其中:
所述对象的选择的部分由不同于所述第一线程的线程独占地保留;以及
未能完成所述对象的所述析构还包括:确定所述对象的所述选择的部分是由不同于所述第一线程的线程独占地保留的。
4.根据权利要求1所述的设备,其中所述对象析构工作流程还包括:
要被执行以销毁所述对象的任务集合;以及
针对相应任务:
所述任务的任务标准;以及
所述任务的状态。
5.根据权利要求1所述的设备,其中:
所述对象析构工作流程响应于发起对象的对象析构来用僵尸状态标记所述对象;以及
所述对象响应于第二线程在所述对象被标记为僵尸状态时访问所述对象,向所述第二线程返回指示所述对象的僵尸状态的警告。
6.根据权利要求1所述的设备,其中:
所述设备还存储包括循环对象图的对象的对象集合;以及
所述对象析构工作流程响应于试图销毁所述对象:
将所述对象标识为包括所述循环对象图的对象的所述对象集合的成员;
调用同步机制以获得对所述循环对象图的所述对象集合的独占访问;
在保持所述同步机制的所述独占访问时,根据析构序列来销毁所述对象集合的所述对象;以及
响应于销毁所述循环对象图的所述对象中的全部对象,释放所述同步机制的所述独占访问。
7.根据权利要求6所述的设备,其中试图销毁所述对象还包括:
确定所述对象被标记为受保护对象,所述受保护对象仅由不同于所述第一线程的选择的线程可销毁;以及
响应于所述确定,拒绝销毁所述对象。
8.一种销毁设备的引用计数环境内的对象的方法,所述设备包括处理器,所述方法包括:
在所述处理器上执行对象析构工作流程,所述对象析构工作流程:
生成对要被销毁的对象的引用的对象析构列表;以及
代表第一线程并且响应于释放对由所述第一线程访问的对象的最后的引用:
试图析构所述对象;以及
响应于未能完成所述对象的析构,将对所述对象的新引用添加到所述对象析构列表作为对所述对象的所述最后的引用,其中将对所述对象的所述最后的引用包括在所述对象析构列表中提示访问所述对象的其他线程尝试销毁所述对象。
9.根据权利要求8所述的方法,其中响应于将对所述对象的所述新引用添加到所述对象析构列表,所述对象析构工作流程向也访问所述对象的第二线程通知将对所述对象的所述新引用添加到所述对象析构列表作为对所述对象的所述最后的引用。
10.根据权利要求9所述的方法,其中:
所述第二线程还包括高于所述第一线程并且共享对所述对象的访问的上级线程;以及
通知所述第二线程还包括:向所述上级线程通知将对所述对象的所述新引用添加到所述对象析构列表作为对所述对象的所述最后的引用。
11.根据权利要求9所述的方法,其中通知所述第二线程还包括:在由所述处理器执行的线程的线程集合中进行搜索,以标识所述第二线程也访问所述对象。
12.根据权利要求9所述的方法,其中:
所述第二线程还包括要被传递给所述第二线程的消息的消息队列;并且
通知所述第二线程还包括:将消息插入到所述第二线程的所述消息队列中,所述消息向所述第二线程通知将对所述对象的所述新引用添加到所述对象析构列表作为对所述对象的所述最后的引用。
13.根据权利要求8所述方法,其中所述对象析构工作流程:
轮询所述对象析构列表以标识对由所述第一线程访问的对象的所述最后的引用;以及
响应于在所述对象析构列表中找到对所述对象的所述最后的引用:从所述对象析构列表移除对所述对象的所述最后的引用;以及释放对所述对象的所述最后的引用。
14.根据权利要求8所述的方法,其中响应于将对所述对象的所述最后的引用接收到所述对象析构列表,所述对象析构列表向第二线程通知将对所述对象的所述新引用添加到所述对象析构列表作为对所述对象的所述最后的引用。
15.根据权利要求14所述的方法,其中通知所述第二线程还包括:响应于标识所述第二线程的挂起状态,激活所述第二线程以处理所述对象析构列表中的对所述对象的所述最后的引用。
16.根据权利要求8所述的方法,其中释放对所述对象的所述最后的引用还包括:周期性地查看所述对象析构列表以标识由所述线程访问的对象。
17.一种销毁设备的引用计数环境内的对象的设备,所述设备包括:
处理器;以及
存储器,存储:
对要被销毁的对象的引用的对象析构列表;以及
对象析构工作流程,包括指令,所述指令在由所述处理器执行时使得所述设备响应于第一线程释放对由所述线程访问的对象的最后的引用:
试图销毁所述对象;以及
响应于未能完成所述对象的析构,将对所述对象的新引用添加到所述对象析构列表作为对所述对象的所述最后的引用,
其中将对所述对象的所述最后的引用包括在所述对象析构列表中提示访问所述对象的其他线程尝试销毁所述对象。
18.根据权利要求17所述的设备,其中:
所述存储器还存储在上下文会话中利用的对象的上下文会话对象集合;以及
所述对象析构列表与所述上下文会话相关联,以存储对所述上下文会话的所述上下文会话对象集合的所述对象的最后的引用。
19.根据权利要求17所述的设备,其中:
所述对象是在所述第一线程释放对所述对象的所述最后的引用时要被保留的保留对象;以及
所述存储器还包括:保留对象高速缓存,所述保留对象高速缓存存储对所述第一线程和第二线程之外的所述对象的高速缓存引用。
20.根据权利要求19所述的设备,其中:
当所述保留对象高速缓存存储对所述保留对象的所述高速缓存引用时,对相应线程内的所述保留对象的其他引用被标记为对所述保留对象的弱引用;以及
所述对象析构工作流程响应于移除对所述保留对象的所述高速缓存引用,将对所述相应线程中的所述保留对象的所述弱引用改变为强引用。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/210,864 | 2016-07-14 | ||
US15/210,864 US10223163B2 (en) | 2016-07-14 | 2016-07-14 | Workflow-based object destruction |
PCT/US2017/040570 WO2018013377A1 (en) | 2016-07-14 | 2017-07-03 | Workflow-based object destruction |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109478148A CN109478148A (zh) | 2019-03-15 |
CN109478148B true CN109478148B (zh) | 2022-03-29 |
Family
ID=59337912
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780043161.0A Active CN109478148B (zh) | 2016-07-14 | 2017-07-03 | 基于工作流程的对象析构 |
Country Status (17)
Country | Link |
---|---|
US (1) | US10223163B2 (zh) |
EP (1) | EP3485375B1 (zh) |
JP (1) | JP6941154B2 (zh) |
KR (1) | KR102399406B1 (zh) |
CN (1) | CN109478148B (zh) |
AU (1) | AU2017295814B2 (zh) |
BR (1) | BR112018077371A8 (zh) |
CA (1) | CA3029992A1 (zh) |
CL (1) | CL2019000006A1 (zh) |
CO (1) | CO2018014030A2 (zh) |
IL (1) | IL264145B (zh) |
MX (1) | MX2019000541A (zh) |
PH (1) | PH12018550216A1 (zh) |
RU (1) | RU2746155C2 (zh) |
SG (1) | SG11201900010QA (zh) |
WO (1) | WO2018013377A1 (zh) |
ZA (1) | ZA201808252B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9747088B2 (en) * | 2013-04-22 | 2017-08-29 | Embarcadero Technologies, Inc. | Automatic reference counting |
JP2019121240A (ja) * | 2018-01-09 | 2019-07-22 | 東芝メモリ株式会社 | ワークフロースケジューリングシステム、ワークフロースケジューリング方法及び電子機器 |
CN110246255A (zh) * | 2019-06-18 | 2019-09-17 | 深圳市简工智能科技有限公司 | 智能锁控制方法、装置、计算机可读存储介质及系统 |
CN113342427B (zh) * | 2021-06-01 | 2022-08-16 | 青岛小鸟看看科技有限公司 | 程序控制方法及装置 |
CN115442635A (zh) * | 2021-06-04 | 2022-12-06 | 武汉斗鱼鱼乐网络科技有限公司 | 一种跨平台安全过滤弹幕的方法、装置、设备和存储介质 |
Family Cites Families (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5398334A (en) | 1992-04-06 | 1995-03-14 | General Electric Company | System for automatic garbage collection using strong and weak encapsulated pointers |
US5758184A (en) * | 1995-04-24 | 1998-05-26 | Microsoft Corporation | System for performing asynchronous file operations requested by runnable threads by processing completion messages with different queue thread and checking for completion by runnable threads |
US6275857B1 (en) | 1996-10-30 | 2001-08-14 | Microsoft Corporation | System and method for freeing shared resources in a computer system |
US6230213B1 (en) | 1997-03-18 | 2001-05-08 | Compaq Computer Corporation | Extensible mechanism for providing safe automatic management of objects |
US6473773B1 (en) | 1997-12-24 | 2002-10-29 | International Business Machines Corporation | Memory management in a partially garbage-collected programming system |
US6119115A (en) * | 1998-03-12 | 2000-09-12 | Microsoft Corporation | Method and computer program product for reducing lock contention in a multiple instruction execution stream processing environment |
US6681263B1 (en) | 1998-03-31 | 2004-01-20 | Intel Corporation | Control of software object lifetime |
GB9906629D0 (en) | 1999-03-23 | 1999-05-19 | Koninkl Philips Electronics Nv | Memory reclamation method |
US6363403B1 (en) * | 1999-06-30 | 2002-03-26 | Lucent Technologies Inc. | Garbage collection in object oriented databases using transactional cyclic reference counting |
KR100333486B1 (ko) * | 1999-12-27 | 2002-04-25 | 오길록 | 객체지향 고 수준 언어에서 병행객체 관리 방법 |
US7216136B2 (en) * | 2000-12-11 | 2007-05-08 | International Business Machines Corporation | Concurrent collection of cyclic garbage in reference counting systems |
US7237237B2 (en) | 2001-07-24 | 2007-06-26 | The Mathworks, Inc. | Designating an object for destruction |
US6728738B2 (en) | 2002-04-03 | 2004-04-27 | Sun Microsystems, Inc. | Fast lifetime analysis of objects in a garbage-collected system |
US7472144B2 (en) * | 2003-07-28 | 2008-12-30 | International Business Machines Corporation | Method and system for resolving memory leaks and releasing obsolete resources from user session data |
US7181463B2 (en) * | 2003-10-24 | 2007-02-20 | Microsoft Corporation | System and method for managing data using static lists |
US7363628B2 (en) * | 2005-06-27 | 2008-04-22 | Microsoft Corporation | Data centric and protocol agnostic workflows for exchanging data between a workflow instance and a workflow host |
CN101046755B (zh) * | 2006-03-28 | 2011-06-15 | 郭明南 | 一种计算机自动内存管理的系统及方法 |
US8548942B2 (en) * | 2006-10-04 | 2013-10-01 | Salesforce.Com, Inc. | Methods and systems for recursive saving of hierarchical objects to a database |
CN101788905A (zh) * | 2009-01-22 | 2010-07-28 | 上海科泰世纪科技有限公司 | Applet托管对象的方法 |
CN101639779B (zh) * | 2009-08-18 | 2012-07-18 | 腾讯科技(深圳)有限公司 | 一种资源释放方法和装置 |
EP2466455A1 (en) | 2010-12-15 | 2012-06-20 | Schneider Electric Buildings AB | Definition of objects in object-oriented programming environments |
EP2671161B1 (en) | 2011-01-31 | 2019-03-13 | The MathWorks, Inc. | System and method for determining an objects lifetime in an object oriented environment |
US9053017B2 (en) | 2011-09-09 | 2015-06-09 | Microsoft Technology Licensing, Llc | Managing object lifetime in a cyclic graph |
US9098515B2 (en) * | 2011-11-15 | 2015-08-04 | Sap Se | Data destruction mechanisms |
CN105373434B (zh) * | 2015-12-16 | 2018-11-13 | 上海携程商务有限公司 | 资源管理系统及方法 |
-
2016
- 2016-07-14 US US15/210,864 patent/US10223163B2/en active Active
-
2017
- 2017-07-03 SG SG11201900010QA patent/SG11201900010QA/en unknown
- 2017-07-03 CN CN201780043161.0A patent/CN109478148B/zh active Active
- 2017-07-03 MX MX2019000541A patent/MX2019000541A/es unknown
- 2017-07-03 AU AU2017295814A patent/AU2017295814B2/en active Active
- 2017-07-03 CA CA3029992A patent/CA3029992A1/en active Pending
- 2017-07-03 JP JP2019500824A patent/JP6941154B2/ja active Active
- 2017-07-03 RU RU2019100443A patent/RU2746155C2/ru active
- 2017-07-03 EP EP17739822.9A patent/EP3485375B1/en active Active
- 2017-07-03 WO PCT/US2017/040570 patent/WO2018013377A1/en unknown
- 2017-07-03 KR KR1020197001359A patent/KR102399406B1/ko active IP Right Grant
- 2017-07-03 BR BR112018077371A patent/BR112018077371A8/pt unknown
-
2018
- 2018-12-06 ZA ZA2018/08252A patent/ZA201808252B/en unknown
- 2018-12-21 CO CONC2018/0014030A patent/CO2018014030A2/es unknown
- 2018-12-28 PH PH12018550216A patent/PH12018550216A1/en unknown
-
2019
- 2019-01-02 CL CL2019000006A patent/CL2019000006A1/es unknown
- 2019-01-08 IL IL264145A patent/IL264145B/en unknown
Also Published As
Publication number | Publication date |
---|---|
CO2018014030A2 (es) | 2019-01-18 |
BR112018077371A2 (pt) | 2019-07-16 |
PH12018550216A1 (en) | 2019-10-28 |
CN109478148A (zh) | 2019-03-15 |
US10223163B2 (en) | 2019-03-05 |
RU2019100443A (ru) | 2020-07-13 |
KR102399406B1 (ko) | 2022-05-17 |
EP3485375B1 (en) | 2024-01-10 |
CA3029992A1 (en) | 2018-01-18 |
KR20190027823A (ko) | 2019-03-15 |
RU2746155C2 (ru) | 2021-04-08 |
WO2018013377A1 (en) | 2018-01-18 |
CL2019000006A1 (es) | 2019-04-26 |
BR112018077371A8 (pt) | 2023-01-31 |
JP2019525321A (ja) | 2019-09-05 |
US20180018206A1 (en) | 2018-01-18 |
IL264145B (en) | 2021-09-30 |
JP6941154B2 (ja) | 2021-09-29 |
AU2017295814A1 (en) | 2018-12-20 |
IL264145A (en) | 2019-02-28 |
EP3485375A1 (en) | 2019-05-22 |
AU2017295814B2 (en) | 2021-09-09 |
SG11201900010QA (en) | 2019-01-30 |
ZA201808252B (en) | 2020-05-27 |
RU2019100443A3 (zh) | 2020-09-23 |
MX2019000541A (es) | 2019-07-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109478148B (zh) | 基于工作流程的对象析构 | |
US9141444B2 (en) | Inter-application communication on mobile platforms | |
US9600353B2 (en) | Persistent and resilient worker processes | |
US10521393B2 (en) | Remote direct memory access (RDMA) high performance producer-consumer message processing | |
CN105955804B (zh) | 一种处理分布式事务的方法与设备 | |
US9900275B2 (en) | Tracking object across processes | |
US9864528B2 (en) | Data object observation among domain-restricted containers | |
US20220261489A1 (en) | Capability management method and computer device | |
KR20080005522A (ko) | 애플리케이션 프레임워크 페이즈화 모델 | |
US20080163224A1 (en) | Modeling interrupts in a business process | |
US10523590B2 (en) | Channel-based mandatory access controls | |
US20180081721A1 (en) | Durable program execution | |
US20230385128A1 (en) | Cross service lock handling | |
CN107015910A (zh) | 保证异步程序健壮性的方法及设备 | |
CN108923973B (zh) | 一种监控方法及装置 | |
CN111382376A (zh) | 一种更改浏览器主页的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40000249 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant |