CriticalSection

CriticalSection[var,expr]

locks the variable var with respect to parallel computation, evaluates expr, then releases var.

CriticalSection[{var1,var2,},expr]

locks all variables vari simultaneously.

Details

  • At most one instance of a critical section with the same lock variable is allowed to run concurrently on any parallel kernel.
  • Variables used as locks should not have a value in the master kernel.

Examples

open allclose all

Basic Examples  (1)

Protect a block of code from interference by other threads:

Without protecting access to the update code, subkernels may overwrite results:

Generalizations & Extensions  (1)

Lock variables can be of the form sym[index]:

Applications  (1)

Separate read and write operations are not thread-safe:

Use CriticalSection to make a whole code section atomic:

Properties & Relations  (2)

Locks are acquired by writing the kernel's ID into the lock variable:

Shared functions can be used for synchronization in place of a critical section:

Less efficient is the use of a shared variable and critical section:

Possible Issues  (1)

Lock variables must not have a value before being used in a critical section:

A deadlock can be broken with an abort:

Neat Examples  (1)

The dining philosophers, deadlock-free:

Introduced in 2008
 (7.0)
 |
Updated in 2020
 (12.1)