WithLock[LocalSymbol["name"],expr]
局所シンボル name をロックして expr を評価した後で,その局所シンボルを解放する.
WithLock[var,expr]
共有変数 var をロック,expr を評価し,共有変数を解放する.
WithLock
WithLock[LocalSymbol["name"],expr]
局所シンボル name をロックして expr を評価した後で,その局所シンボルを解放する.
WithLock[var,expr]
共有変数 var をロック,expr を評価し,共有変数を解放する.
詳細とオプション
- WithLockはFileまたはLocalSymbolを作ることでロックする.WithLockはFileまたはLocalSymbolを削除することで解放する.
- WithLockは,ロックオブジェクトがすでにロックされている場合はロックが解放されるまで待つ.
- ロックはアトミックである.最大で1つのプロセスしかオブジェクトをロックできないので,そのプロセスが expr を独占的に評価できる.
- WithLockは属性HoldAllを持つ.
- 次は,使用可能なオプションである.
-
TimeConstraint Infinity ロックが使用可能になるまで待つ時間 ExpirationDate None ロックがいつ期限切れになるか PersistenceTime Infinity ロックが有効である期間 - TimeConstraintの時間内でロックが得られなければ,WithLockは$TimedOutを返し,expr の評価は行わない.
- 有効期限または寿命に達したロックは,それをロックしようとする次のWithLockによってアンロックされる.ExpirationDateは有効期限の絶対日付/時間を与える.PersistenceTimeは相対的な時間を与える.
- WithLock[var,expr]は並列サブカーネル間のロックに共有変数を使う.これはCriticalSection[var,expr]に等しい.
- 異なるコンピュータで使用される際,ロックファイルはWithLockが実行されているすべてのコンピュータが使用可能な共有ファイルシステムになければならない.
例題
すべて開く すべて閉じる例 (2)
file = CreateFile[]同じディレクトリ内のロックファイルで同時アクセスを阻止する:
lock = file <> "-lck"いくつかの並列プロセスを使って同じファイルに同時に書き込もうとする:
With[{file = file, lock = lock},
ParallelEvaluate[WithLock[File[lock], PutAppend[$KernelID, file]]]
];データは,プロセス間の干渉なしに(非決定論的順序で)書き込まれた:
ReadList[file]file = CreateFile[];Put[0, file]ファイルを読み,ファイルに更新された値を書き込むことを同時に行う:
With[{file = file, lock = file <> "-lck"},
ParallelEvaluate[WithLock[File[lock], v = Get[file] + 1;Put[v, file];v]]
]Get[file]保護されていない同時アクセスは,互いの値を上書きし,部分的な値を読み出してしまうかもしれない:
Put[0, file]With[{file = file},
ParallelEvaluate[v = Get[file] + 1;Put[v, file];v]
]スコープ (3)
ファイルのロック (1)
局所シンボルによるロック (1)
オプション (3)
ExpirationDate (1)
ロック過程がロックを解放できなくなるのを防ぐために,ロックには有効期限が設定できる:
WithLock[File["/tmp/lock"], expr, ExpirationDate -> Now + Quantity[10, "Seconds"]]Get["/tmp/lock"]ロックが期限切れになると,次にこれを使用するWithLockがロックを解除する:
WithLock[File["/tmp/lock"], Print["success"]]PersistenceTime (1)
ロック過程がロックを解放できなくなるのを防ぐために,ロックに有効期限が設定できる:
WithLock[File["/tmp/lock"], expr, PersistenceTime -> 10]Get["/tmp/lock"]ロック期限切れになると,次にこれを使用するWithLockがロックを解除する:
WithLock[File["/tmp/lock"], Print["success"]]TimeConstraint (1)
ロックされているとWithLockは永遠に待つので,放棄する必要がある:
lock = CreateFile[];WithLock[File[lock], Print["inside lock"]]有限のタイムアウト値を与えてロックが使用可能になるまでの時間を制限する:
WithLock[File[lock], Print["inside lock"], TimeConstraint -> 2]特性と関係 (2)
WithLockで共有されている値を使うことはCriticalSectionに等しい:
ParallelEvaluate[WithLock[locksym, Put[$KernelID, "/tmp/output"]]];ParallelEvaluate[CriticalSection[locksym, Put[$KernelID, "/tmp/output"]]];Get["/tmp/output"]LocalSymbol["counter"] = 0;ParallelEvaluate[LocalSymbol["counter"]++]LocalSymbol["counter"]考えられる問題 (4)
ロックとし使用するファイルが既存の場合はロックがハングする:
lock = CreateFile[]WithLock[File[lock], Print["inside lock"]]WithLock[File[lock <> ".lck"], Print["inside lock"]]ロックとして使われる局所ファイルに値がある場合はロックがハングする:
LocalSymbol["/tmp/lock"] = 0;WithLock[LocalSymbol["/tmp/lock"], Print["inside lock"]]Remove[LocalSymbol["/tmp/lock"]]WithLock[LocalSymbol["/tmp/lock"], Print["inside lock"]]すべてのファイルシステムが局所シンボルのロックについての必要な操作をサポートする訳ではない:
$LocalSymbolBaseWithLock[LocalSymbol["lock"], Print["inside lock"]]WithLock[File["lock"], Print["inside lock"]]ローカルマシンと1つのリモートマシンで並列カーネルを起動する:
LaunchKernels[{KernelConfiguration["Local", "KernelCount" -> 4], KernelConfiguration["andromeda", "KernelCount" -> 4]}];$KernelCountローカルのファイルシステムで作成されたファイルとロックファイルは,リモートマシンでは使えないかもしれない:
file = CreateFile[]
lock = file <> ".lck"With[{lock = File[lock], file = file},
ParallelEvaluate[WithLock[lock, PutAppend[{$MachineName, $KernelID}, file];$KernelID]]]このファイルでは,ローカルカーネルからの結果しか使用できない:
FilePrint[file]リモートマシンからの結果は,そのマシンにローカルなファイルに書き込まれている:
RemoteEvaluate["andromeda", FilePrint[file]]file = FileNameJoin[{$HomeDirectory, "output.txt"}]
lock = file <> ".lck"With[{lock = File[lock], file = file},
ParallelEvaluate[WithLock[lock, PutAppend[{$MachineName, $KernelID}, file];$KernelID]]]FilePrint[file]関連するガイド
-
▪
- 並行性
テキスト
Wolfram Research (2021), WithLock, Wolfram言語関数, https://reference.wolfram.com/language/ref/WithLock.html.
CMS
Wolfram Language. 2021. "WithLock." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/WithLock.html.
APA
Wolfram Language. (2021). WithLock. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/WithLock.html
BibTeX
@misc{reference.wolfram_2026_withlock, author="Wolfram Research", title="{WithLock}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/WithLock.html}", note=[Accessed: 07-July-2026]}
BibLaTeX
@online{reference.wolfram_2026_withlock, organization={Wolfram Research}, title={WithLock}, year={2021}, url={https://reference.wolfram.com/language/ref/WithLock.html}, note=[Accessed: 07-July-2026]}