<a id="multicore-processing"></a>

# Multicore Processing

<a id="multicore-processing-support"></a>

## Multicore Processing Support in eVision

Since release 2.7, **eVision** supports multicore processing and some algorithms and operations are optimized to take advantage of modern multicore CPUs.

* By default, parallel processing is disabled. That means, all operations run on a single core.

To enable parallel processing in your current thread, use [`Easy::SetMaxNumberOfProcessingThreads`](../../doxygen_cpp/classeVision_1_1Easy.html#a07daba7dfbeff40db5e1d9e4404d4722) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy.html#ae729364026373ca376e818d4b82cd978) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy.html#ae819b646aea6778997c6155442a0ccee).

* Use with a value greater than 1.
* The maximal value is the number of physical core of the CPU on which the application will run (not including hyper-threading).
* It is a good idea to choose a lower thread count to reserve some processing power for other applications.

#### NOTE
[`Easy::SetMaxNumberOfProcessingThreads`](../../doxygen_cpp/classeVision_1_1Easy.html#a07daba7dfbeff40db5e1d9e4404d4722) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy.html#ae729364026373ca376e818d4b82cd978) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy.html#ae819b646aea6778997c6155442a0ccee) only sets the maximum number of processing threads for the thread in which the function is called.

<a id="thread-safety"></a>

## Thread Safety for eVision Types

* **eVision** supports simultaneous execution by multiple (unlimited) threads on the same CPU, but data can only be accessed by one thread at a time. So independent tasks can execute simultaneously in your application, but access to each piece of shared data must be synchronized so that only one thread uses it at a time.
* The following rules avoid data corruption, crashes and misbehaving programs.

<a id="thread-safety-pixel-structures"></a>

### Pixel Structures

Pixel types have no restrictions regarding the use (read and write) from different threads. This includes the following types: [`EColor`](../../doxygen_cpp/structeVision_1_1EColor.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EColor.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EColor.html), [`EPeak`](../../doxygen_cpp/structeVision_1_1EPeak.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EPeak.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPeak.html), [`EISH`](../../doxygen_cpp/structeVision_1_1EISH.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EISH.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EISH.html), [`ELAB`](../../doxygen_cpp/structeVision_1_1ELAB.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ELAB.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELAB.html), [`ELCH`](../../doxygen_cpp/structeVision_1_1ELCH.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ELCH.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELCH.html), [`ELSH`](../../doxygen_cpp/structeVision_1_1ELSH.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ELSH.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELSH.html), [`ELUV`](../../doxygen_cpp/structeVision_1_1ELUV.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ELUV.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELUV.html), [`EBW8`](../../doxygen_cpp/structeVision_1_1EBW8.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EBW8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW8.html), [`EBW8Path`](../../doxygen_cpp/structeVision_1_1EBW8Path.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EBW8Path.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW8Path.html), [`EBW16`](../../doxygen_cpp/structeVision_1_1EBW16.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EBW16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW16.html), [`EBW16Path`](../../doxygen_cpp/structeVision_1_1EBW16Path.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EBW16Path.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW16Path.html), [`EBW32`](../../doxygen_cpp/structeVision_1_1EBW32.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EBW32.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW32.html), [`EC24`](../../doxygen_cpp/structeVision_1_1EC24.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EC24.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EC24.html), [`EC24A`](../../doxygen_cpp/structeVision_1_1EC24A.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EC24A.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EC24A.html), [`EC24Path`](../../doxygen_cpp/structeVision_1_1EC24Path.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EC24Path.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EC24Path.html), [`EPath`](../../doxygen_cpp/structeVision_1_1EPath.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EPath.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPath.html), [`ERGB`](../../doxygen_cpp/structeVision_1_1ERGB.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ERGB.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERGB.html), [`ERGBColor`](../../doxygen_cpp/structeVision_1_1ERGBColor.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1ERGBColor.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERGBColor.html), [`EVSH`](../../doxygen_cpp/structeVision_1_1EVSH.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EVSH.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EVSH.html), [`EXYZ`](../../doxygen_cpp/structeVision_1_1EXYZ.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EXYZ.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EXYZ.html), [`EYIQ`](../../doxygen_cpp/structeVision_1_1EYIQ.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EYIQ.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EYIQ.html), [`EYSH`](../../doxygen_cpp/structeVision_1_1EYSH.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EYSH.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EYSH.html), [`EYUV`](../../doxygen_cpp/structeVision_1_1EYUV.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EYUV.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EYUV.html), [`EDepth8`](../../doxygen_cpp/structeVision_1_1EDepth8.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EDepth8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EDepth8.html), [`EDepth16`](../../doxygen_cpp/structeVision_1_1EDepth16.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EDepth16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EDepth16.html) and [`EDepth32f`](../../doxygen_cpp/structeVision_1_1EDepth32f.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EDepth32f.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EDepth32f.html).

<a id="thread-safety-pixel-collections"></a>

### Pixel Collection Classes

Collection classes have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going. This includes the following types: [`EColorLookup`](../../doxygen_cpp/classeVision_1_1EColorLookup.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EColorLookup.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EColorLookup.html), [`EPseudoColorLookup`](../../doxygen_cpp/classeVision_1_1EPseudoColorLookup.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPseudoColorLookup.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPseudoColorLookup.html), [`EPeakVector`](../../doxygen_cpp/classeVision_1_1EPeakVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPeakVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPeakVector.html), [`EBW8Vector`](../../doxygen_cpp/classeVision_1_1EBW8Vector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBW8Vector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW8Vector.html), [`EBWHistogramVector`](../../doxygen_cpp/classeVision_1_1EBWHistogramVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBWHistogramVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBWHistogramVector.html), [`EBW8PathVector`](../../doxygen_cpp/classeVision_1_1EBW8PathVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBW8PathVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW8PathVector.html), [`EBW16PathVector`](../../doxygen_cpp/classeVision_1_1EBW16PathVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBW16PathVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW16PathVector.html), [`EBW16Vector`](../../doxygen_cpp/classeVision_1_1EBW16Vector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBW16Vector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW16Vector.html), [`EBW32Vector`](../../doxygen_cpp/classeVision_1_1EBW32Vector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBW32Vector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBW32Vector.html), [`EC24Vector`](../../doxygen_cpp/classeVision_1_1EC24Vector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EC24Vector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EC24Vector.html), [`EPathVector`](../../doxygen_cpp/classeVision_1_1EPathVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPathVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPathVector.html), [`EColorVector`](../../doxygen_cpp/classeVision_1_1EColorVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EColorVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EColorVector.html), [`EColorLookup`](../../doxygen_cpp/classeVision_1_1EColorLookup.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EColorLookup.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EColorLookup.html) and [`EC24PathVector`](../../doxygen_cpp/classeVision_1_1EC24PathVector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EC24PathVector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EC24PathVector.html).

<a id="thread-safety-image-classes"></a>

### Image Classes

Image classes have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going. This includes the following types: [`EImageBW8`](../../doxygen_cpp/classeVision_1_1EImageBW8.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageBW8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageBW8.html), [`EImageBW16`](../../doxygen_cpp/classeVision_1_1EImageBW16.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageBW16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageBW16.html), [`EImageBW32`](../../doxygen_cpp/classeVision_1_1EImageBW32.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageBW32.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageBW32.html), [`EImageC24`](../../doxygen_cpp/classeVision_1_1EImageC24.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageC24.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageC24.html), [`EImageC24A`](../../doxygen_cpp/classeVision_1_1EImageC24A.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageC24A.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageC24A.html), [`EImageBW32`](../../doxygen_cpp/classeVision_1_1EImageBW32.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageBW32.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageBW32.html), [`EFourierImage`](../../doxygen_cpp/classeVision_1_1EFourierImage.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EFourierImage.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EFourierImage.html) and [`EImageBW32f`](../../doxygen_cpp/classeVision_1_1EImageBW32f.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageBW32f.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageBW32f.html).

<a id="thread-safety-3d-map-classes"></a>

### 3D Map Classes

3D map classes have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going. This includes the following types: [`EDepthMap8`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EDepthMap8.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EDepthMap8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EDepthMap8.html), [`EDepthMap16`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EDepthMap16.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EDepthMap16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EDepthMap16.html), [`EDepthMap32f`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EDepthMap32f.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EDepthMap32f.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EDepthMap32f.html), [`EZMap8`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EZMap8.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EZMap8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EZMap8.html), [`EZMap16`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EZMap16.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EZMap16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EZMap16.html) and [`EZMap32f`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EZMap32f.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EZMap32f.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EZMap32f.html).

<a id="thread-safety-roi-classes"></a>

### ROI Classes

Concerning ROI, the read and write operations should be classified in two categories:

* Read and write operations on the configuration of the ROI itself such as its dimensions and origin.
  * These have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going.
* Read and write operations on the attached image.
  * Read operations should take into account the fact that another ROI could be attached to the same image and that write operations could be on-going.

This concerns the following types: [`EROIBW8`](../../doxygen_cpp/classeVision_1_1EROIBW8.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EROIBW8.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EROIBW8.html), [`EROIBW16`](../../doxygen_cpp/classeVision_1_1EROIBW16.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EROIBW16.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EROIBW16.html), [`EROIBW32`](../../doxygen_cpp/classeVision_1_1EROIBW32.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EROIBW32.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EROIBW32.html), [`EROIC24`](../../doxygen_cpp/classeVision_1_1EROIC24.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EROIC24.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EROIC24.html), [`EROIC24A`](../../doxygen_cpp/classeVision_1_1EROIC24A.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EROIC24A.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EROIC24A.html).

<a id="thread-safety-region-classes"></a>

### Region Classes

Region classes have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going. It must be taken into account that a region could have been submitted to an algorithm and that modifying the region during the execution of the algorithm is forbidden.

This concerns the following types: [`ERegion`](../../doxygen_cpp/classeVision_1_1ERegion.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ERegion.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERegion.html), [`ERectangleRegion`](../../doxygen_cpp/classeVision_1_1ERectangleRegion.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ERectangleRegion.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERectangleRegion.html), [`ECircleRegion`](../../doxygen_cpp/classeVision_1_1ECircleRegion.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ECircleRegion.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ECircleRegion.html), [`EEllipseRegion`](../../doxygen_cpp/classeVision_1_1EEllipseRegion.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EEllipseRegion.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EEllipseRegion.html) and [`EPolygonRegion`](../../doxygen_cpp/classeVision_1_1EPolygonRegion.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPolygonRegion.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPolygonRegion.html).

<a id="thread-safety-utility-classes"></a>

### Utility Classes

Utility classes are classes that cannot be instantiated, and are used through their static methods. This concerns [`EasyImage`](../../doxygen_cpp/classeVision_1_1EasyImage.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyImage.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyImage.html) and [`EasyColor`](../../doxygen_cpp/classeVision_1_1EasyColor.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyColor.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyColor.html). The methods of these utility classes can be used from any thread, assuming the threading rules for their arguments are respected.

<a id="thread-safety-geometric-classes"></a>

### Geometric Classes

Geometric classes have no read restrictions. However, write operations should be synchronized. Read operations should not happen when a write operation is on-going.

This includes the following types: [`EFrame`](../../doxygen_cpp/classeVision_1_1EFrame.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EFrame.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EFrame.html), [`EPoint`](../../doxygen_cpp/structeVision_1_1EPoint.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EPoint.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPoint.html), [`ECircle`](../../doxygen_cpp/classeVision_1_1ECircle.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ECircle.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ECircle.html), [`ELine`](../../doxygen_cpp/classeVision_1_1ELine.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ELine.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELine.html), [`ERectangle`](../../doxygen_cpp/classeVision_1_1ERectangle.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ERectangle.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERectangle.html) and [`EWedge`](../../doxygen_cpp/classeVision_1_1EWedge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EWedge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EWedge.html).

<a id="thread-safety-easygauge"></a>

### EasyGauge

Multiple gauges may perform measurements on the same image from different threads. A single instance cannot be read or modified from multiple threads. Geometric results can be read from multiple threads, write operations should be synchronized.

This concerns the following classes: [`EBaseGauge`](../../doxygen_cpp/classeVision_1_1EBaseGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBaseGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EBaseGauge.html), [`ECircleGauge`](../../doxygen_cpp/classeVision_1_1ECircleGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ECircleGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ECircleGauge.html), [`ELineGauge`](../../doxygen_cpp/classeVision_1_1ELineGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ELineGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ELineGauge.html), [`EPointGauge`](../../doxygen_cpp/classeVision_1_1EPointGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPointGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPointGauge.html), [`EPolygonGauge`](../../doxygen_cpp/classeVision_1_1EPolygonGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPolygonGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPolygonGauge.html), [`ERectangleGauge`](../../doxygen_cpp/classeVision_1_1ERectangleGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ERectangleGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ERectangleGauge.html), [`EWedgeGauge`](../../doxygen_cpp/classeVision_1_1EWedgeGauge.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EWedgeGauge.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EWedgeGauge.html).

<a id="thread-safety-easymatch-easyfind"></a>

### EasyMatch and EasyFind

Multiple finders and matchers may perform matching on the same image from different threads. A single instance cannot be read or modified from multiple threads. Matched results can be read from multiple threads, write operations should be synchronized.

This concerns the following classes: [`EMatcher`](../../doxygen_cpp/classeVision_1_1EMatcher.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EMatcher.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EMatcher.html), [`EMatchPosition`](../../doxygen_cpp/structeVision_1_1EMatchPosition.html) [<sub>.NET</sub>](../../doxygen_cs/structeVision_1_1EMatchPosition.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EMatchPosition.html), [`EPatternFinder`](../../doxygen_cpp/classeVision_1_1EPatternFinder.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EPatternFinder.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EPatternFinder.html) and [`EFoundPattern`](../../doxygen_cpp/classeVision_1_1EFoundPattern.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EFoundPattern.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EFoundPattern.html).

<a id="thread-safety-easyocr"></a>

### EasyOCR, EasyOCR2 and EasyDeepOCR

Multiple text readers may perform reading on the same image from different threads. A single instance cannot be read or modified from multiple threads. Read results can be read from multiple threads, write operations should be synchronized.

This concerns the following classes: [`EOCR`](../../doxygen_cpp/classeVision_1_1EOCR.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EOCR.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EOCR.html), [`EOCR2`](../../doxygen_cpp/classeVision_1_1EOCR2.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EOCR2.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EOCR2.html) and [`ETextReader`](../../doxygen_cpp/classeVision_1_1EasyDeepOCR_1_1ETextReader.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyDeepOCR_1_1ETextReader.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyDeepOCR_1_1ETextReader.html).

<a id="thread-safety-easymatrixcode"></a>

### EasyMatrixCode and EasyMatrixCode2

A matrix code reader cannot be used from multiple threads. The returned matrix code cannot be used in multiple threads.

This concerns the following classes: [`EMatrixCodeReader`](../../doxygen_cpp/classeVision_1_1EMatrixCodeReader.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EMatrixCodeReader.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EMatrixCodeReader.html) and [`EasyMatrixCode2.EMatrixCodeReader`](../../doxygen_cpp/classeVision_1_1EasyMatrixCode2_1_1EMatrixCodeReader.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyMatrixCode2_1_1EMatrixCodeReader.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyMatrixCode2_1_1EMatrixCodeReader.html).

<a id="thread-safety-easyqrcode"></a>

### EasyQRCode

A QR code reader cannot be used from multiple threads. The returned QR code cannot be used in multiple threads.

This concerns the following class: [`EQRCodeReader`](../../doxygen_cpp/classeVision_1_1EQRCodeReader.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EQRCodeReader.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EQRCodeReader.html).

<a id="thread-safety-easybarcode"></a>

### EasyBarCode and EasyBarCode2

A barcode reader cannot be used from multiple threads. The returned barcode cannot be used in multiple threads.

This concerns the following class: [`EBarCode`](../../doxygen_cpp/classeVision_1_1EBarCode.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EBarCode.html) and [`EBarCodeReader`](../../doxygen_cpp/classeVision_1_1EasyBarCode2_1_1EBarCodeReader.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyBarCode2_1_1EBarCodeReader.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyBarCode2_1_1EBarCodeReader.html).

<a id="thread-safety-easyobject"></a>

### EasyObject

**Image encoder:** Multiple image encoders may process the same image from different threads. A single instance cannot be used from multiple threads simultaneously. Encoded results can be read from multiple threads, but write operations should be synchronized.

This concerns the following classes: [`EImageEncoder`](../../doxygen_cpp/classeVision_1_1EImageEncoder.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EImageEncoder.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EImageEncoder.html), [`ECodedImage2`](../../doxygen_cpp/classeVision_1_1ECodedImage2.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ECodedImage2.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ECodedImage2.html) and [`EObjectSelection`](../../doxygen_cpp/classeVision_1_1EObjectSelection.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EObjectSelection.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EObjectSelection.html).

**EChecker:** Multiple checkers may verify the same image from different threads. A single instance cannot be used from multiple threads simultaneously. Verification results can be read from multiple threads, but write operations should be synchronized.

This concerns the following class: [`EChecker`](../../doxygen_cpp/classeVision_1_1EChecker.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EChecker.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EChecker.html).

<a id="thread-safety-easy3d"></a>

### Easy3D

Multiple Easy3D tool instances may operate on the same data from different threads. A single instance cannot be used from multiple threads simultaneously. Results can be read from multiple threads, but write operations should be synchronized.

This concerns the following classes: [`EPointCloud`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPointCloud.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EPointCloud.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EPointCloud.html), [`EPlaneFitter`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPlaneFitter.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EPlaneFitter.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EPlaneFitter.html), [`EPlaneFinder`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPlaneFinder.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EPlaneFinder.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EPlaneFinder.html), [`ESphereFitter`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1ESphereFitter.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1ESphereFitter.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1ESphereFitter.html), [`Easy3DMatch::E3DAligner`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DAligner.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DAligner.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1E3DAligner.html), [`E3DMatcher`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DMatcher.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DMatcher.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1E3DMatcher.html), [`E3DComparer`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DComparer.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DComparer.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1E3DComparer.html), [`EPrincipalAxisExtractor`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPrincipalAxisExtractor.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EPrincipalAxisExtractor.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EPrincipalAxisExtractor.html), [`EPhotometricStereoImager`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPhotometricStereoImager.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1EPhotometricStereoImager.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1EPhotometricStereoImager.html) and [`Easy3DLaserLine::ELaserLineExtractor`](../../doxygen_cpp/classeVision_1_1Easy3D_1_1ELaserLineExtractor.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy3D_1_1ELaserLineExtractor.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy3D_1_1ELaserLineExtractor.html).

<a id="thread-safety-easydeeplearning"></a>

### EasyDeepLearning

Deep learning tools may perform operations on the same image from different threads. A tool instance cannot be used from different threads. Using [`Easy::SetMaxNumberOfProcessingThreads`](../../doxygen_cpp/classeVision_1_1Easy.html#a07daba7dfbeff40db5e1d9e4404d4722) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1Easy.html#ae729364026373ca376e818d4b82cd978) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1Easy.html#ae819b646aea6778997c6155442a0ccee) to increase the number of CPU cores used by **eVision** greatly improves the processing speed.

This concerns the following classes: [`EClassifier`](../../doxygen_cpp/classeVision_1_1EasyDeepLearning_1_1EClassifier.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyDeepLearning_1_1EClassifier.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyDeepLearning_1_1EClassifier.html), [`ELocator`](../../doxygen_cpp/classeVision_1_1EasyDeepLearning_1_1ELocator.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyDeepLearning_1_1ELocator.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyDeepLearning_1_1ELocator.html), [`ESupervisedSegmenter`](../../doxygen_cpp/classeVision_1_1EasyDeepLearning_1_1ESupervisedSegmenter.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyDeepLearning_1_1ESupervisedSegmenter.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyDeepLearning_1_1ESupervisedSegmenter.html) and [`EUnsupervisedSegmenter`](../../doxygen_cpp/classeVision_1_1EasyDeepLearning_1_1EUnsupervisedSegmenter.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1EasyDeepLearning_1_1EUnsupervisedSegmenter.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1EasyDeepLearning_1_1EUnsupervisedSegmenter.html).

<a id="thread-safety-easyspotdetector"></a>

### EasySpotDetector

Multiple spot detectors may perform detection on the same image from different threads. A single instance cannot be used from multiple threads simultaneously. Detection results can be read from multiple threads, but write operations should be synchronized.

This concerns the following classes: [`ESpotDetector`](../../doxygen_cpp/classeVision_1_1ESpotDetector.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ESpotDetector.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ESpotDetector.html) and [`ESpot`](../../doxygen_cpp/classeVision_1_1ESpot.html) [<sub>.NET</sub>](../../doxygen_cs/classeVision_1_1ESpot.html) [<sub>Python</sub>](../../doxygen_python/classeVision_1_1ESpot.html).
