Visual C++ 2010 comes with new features and enhancements to simplify more native programming. The Concurrency Runtime (CRT), for instance, is a framework that simplifies parallel programming and helps you write robust, scalable, and responsive parallel applications.
The CRT raises the level of abstraction so that you do not have to manage the infrastructure details that are related to concurrency. The Concurrency Runtime also enables you to specify scheduling policies that meet the quality of service demands of your applications.
Here's the architecture of Concurrent Runtime Framework:
In this article I discuss the ResourceManager layer and examine how it works internally. To do so, I use CppDepend, an analysis tool that makes it easier for you to manage complex C\C++ (Native, Mixed, and COM) code bases.
Which classes are used by ResourceManager to achieve its responsibility?
SELECT TYPES WHERE IsDirectlyUsedBy "Concurrency.details.ResourceManager"
The first thing to note about this design is that it enforces:
High Cohesion: Many classes and structs are used by ResourceManager and each one has a specific responsibility.The single responsibility principle states that a class should have more than one reason to change. Such a class is said to be "cohesive". A high LCOM value generally pinpoints a poorly cohesive class. There are several LCOM metrics. The LCOM takes its values in the range [0-1]. The LCOMHS (HS stands for "Henderson-Sellers') takes its values in the range [0-2]. Note that the LCOMHS metric is often considered as more efficient to detect non-cohesive types. LCOMHS value higher than 1 should be considered alarming.
WARN IF Count > 0 IN SELECT TYPES WHERE LCOMHS > 1 AND NbFields > 10 AND NbMethods >10 AND !IsGlobal ORDER BY LCOMHS DESC
So among classes used by ResourceManager, only UMS is considered as class with a poor cohesion.
Low Coupling:Many interfaces and proxies are used to isolate ResourceManager from other components. The Scheduler communicates with ResourceManager but there's no direct link between two components. So how the scheduler communicate with ResourceManager? To answer to this question let's discover classes using ResourceManager:
SELECT TYPES WHERE IsDirectlyUsing "Concurrency.details.ResourceManager"
Only these classes use the ResourceManager, and the Scheduler doesn't know the ResourceManager directly. So how it interact with it? Let's add to dependency graph the scheduler and interfaces used by it.
As shown in the dependency graph the Scheduler communicate with ResourceManager using interfaces
Where is the ResourceManager created?
SELECT METHODS WHERE DepthOfCreateA "Concurrency.details.ResourceManager" = = 1
Only ResourceManager create an instance, and since it's a singleton only one ResourceManager exist for the whole process.