CriticalSection[var,expr]
並列計算のためのロック var を取得し,expr を評価し,ロック var を解放する.
CriticalSection[{var1,var2,…},expr]
すべての変数 variを同時にロックする.
CriticalSection
CriticalSection[var,expr]
並列計算のためのロック var を取得し,expr を評価し,ロック var を解放する.
CriticalSection[{var1,var2,…},expr]
すべての変数 variを同時にロックする.
詳細
- 任意の並列カーネル上で同時実行できる同じロック変数の危険域が最高で1つ許容される.
- ロックとして使われる変数はマスターカーネルの値を持っていてはならない.
- WithLock[var,expr]はCriticalSection[var,expr]に等しい.
例題
すべて開く すべて閉じる例 (5)
SetSharedVariable[xs];Clear[xslock];xs = 0;
ParallelDo[CriticalSection[xslock, xs = xs + 1], {10}];
xs更新コードへのアクセスから保護しないと,サブカーネルが結果を上書きしてしまうかもしれない:
xs = 0;
ParallelDo[xs = xs + 1, {10}];
xsParallelTable[CriticalSection[{locks[Mod[i, 2]]}, i], {i, 10}]インデックス付きの2つのロック変数を使って更新操作のソースインデックスと宛先インデックスを保護する:
Clear[locks];size = 10; bins = ConstantArray[0, size];
SetSharedVariable[bins]ParallelDo[
With[{i = RandomInteger[{1, size - 1}]}, CriticalSection[{locks[i], locks[i + 1]}, bins[[i]]++;bins[[i + 1]]--]], {100}];
binsTotal[%]アプリケーション (1)
n = 0;SetSharedVariable[n]ParallelEvaluate[n = n + 1]nCriticalSectionを使ってコードセクション全体を原子的にする:
n = 0;SetSharedVariable[n];Clear[nlock]ParallelEvaluate[CriticalSection[nlock, n = n + 1]]n特性と関係 (1)
Monitor[ParallelEvaluate[CriticalSection[lock, Pause[0.5];$KernelID]], lock]mlist = {};
include[e_] := (mlist = Union[mlist, {e}];)
SetSharedFunction[include]ParallelDo[include[RandomInteger[10]], {10}]mlistこれより効率は下がるが,共有変数と危険域を使うこともできる:
slist = {};SetSharedVariable[slist];
Clear[lock]ParallelDo[e = RandomInteger[10];CriticalSection[lock, slist = Union[slist, {e}]], {10}]slistWithLockはCriticalSectionがシンボルに動作するのと同じように動作する:
SetSharedVariable[xs];xs = 0;
ParallelDo[WithLock[xslock, xs = xs + 1], {10}];
xs考えられる問題 (1)
おもしろい例題 (1)
rp := Pause[RandomReal[4]];PrintTemporary[Dynamic[Array[forks, $KernelCount]]];
Clear[forks];forks[_] := Null;
With[{nf = $KernelCount},
ParallelTable[
With[{i1 = i, i2 = Mod[i + 1, nf, 1]},
Do[Print[i, " thinking"];rp;Print[i, " hungry"];
CriticalSection[{forks[i1], forks[i2]}, Print[i, " eating"];rp],
{2}]],
{i, nf}]];関連するガイド
-
▪
- 並列計算におけるリソースの共有 ▪
- 並列計算 ▪
- 並行性
テキスト
Wolfram Research (2008), CriticalSection, Wolfram言語関数, https://reference.wolfram.com/language/ref/CriticalSection.html (2020年に更新).
CMS
Wolfram Language. 2008. "CriticalSection." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2020. https://reference.wolfram.com/language/ref/CriticalSection.html.
APA
Wolfram Language. (2008). CriticalSection. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/CriticalSection.html
BibTeX
@misc{reference.wolfram_2026_criticalsection, author="Wolfram Research", title="{CriticalSection}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/CriticalSection.html}", note=[Accessed: 16-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_criticalsection, organization={Wolfram Research}, title={CriticalSection}, year={2020}, url={https://reference.wolfram.com/language/ref/CriticalSection.html}, note=[Accessed: 16-October-2026]}