locked { ... } -> objectRuby 3.1 から[permalink][rdoc][edit][A] () { (IO::Buffer) → A } → A-
ブロックを実行する間、バッファをロックします。ブロックの値を返します。
ロックされている間、そのバッファに対して IO::Buffer::Storage#resize や IO::Buffer::Storage#free、IO::Buffer::Storage#transfer を呼ぶと IO::Buffer::LockedError が発生します。 IO::Buffer#locked は、ロック中のバッファに対しても呼べます。ロックは同じメモリ領域を参照する IO::Buffer::Slice と共有されるため、スライスをロックしている間は、参照元の IO::Buffer::Storage#resize も IO::Buffer::LockedError になります。ロック中でも、スライスの IO::Buffer::Slice#resize と IO::Buffer#advance は呼べます。バッファへの読み書き自体はロック中も行えます。
システムコールでバッファを使っている間に、そのバッファが移動したり解放されたりしないことを保証するための仕組みです。スレッド安全ではないため、複数のスレッドでバッファを共有する場合は別に同期の手段が必要です。
ブロックの実行中に例外が発生した場合もロックは解除されます。
- [EXCEPTION]
LocalJumpError: - ブロックを渡さなかった場合に発生します。
例: ロック中は大きさの変更や解放ができないbuf = IO::Buffer.new(4) p buf.locked? # => false p buf.locked { buf.locked? } # => true p buf.locked? # => false # ブロックの値がそのまま返る p buf.locked { "done" } # => "done"buf = IO::Buffer.new(4) buf.locked { buf.resize(8) } # ~> IO::Buffer::LockedError[SEE_ALSO] IO::Buffer#locked?, IO::Buffer::LOCKED
- [EXCEPTION]