LoginSignup
7
5

More than 5 years have passed since last update.

NSLockメモ

Posted at

詳しくは「スレッドプログラミングガイド」参照

ロックはスレッドの排他制御に必要。
注:アップルはスレッドプログラミングではなくより簡便な代替テクノロジー(NSOperation, GCD, アイドル時間通知、非同期関数、タイマー、別プロセス)を使うことを勧めている。

スレッドの実装

スレッドの基礎にある実装メカニズムはMachスレッド

POSIX API

スレッドの3つの状態

実行、実行可能、ブロック

NSLockingプロトコル

ロックオブジェクトが持つべきメソッド。lock,unlock。

lock ロックを取得する。ロックが取得できるまでスレッドを止める。
unlock ロックを開放する。

NSLock

NSLockingの実装の一つ。
NSLockingプロコトル以外により細かな制御ができる。

tryLock: ロックでなかったときに直ちにNOを返す。lockが開放されるまで待つのと対照的。
lockBeforeDate: 指定時刻までにロックできなかったらNOを返す。
setName: ロックに名前をつける。
name

NSConditionLock

NSLockingの実装の一つ。特定の条件(Condition 整数値)の場合にロック、アンロックができるようにする。Producer-Consumer パターンを実装できる。

initWithCondition: ロックを特定の条件で作る。
lockWhenCondition: この条件になっていたらロックが取れる。(ちなみに単にlockだと条件と無関係にロックを取る。)
unlockWithCondition: ロックを開放し、条件を設定する。

また、NSLockと同様に,tryLock,tryBeforeDateがあり、それのCondition版がある。

NSRecursiveLock

ロックの回数がカウントされるので同一スレッドでロックしてもデッドロックにならずそのまま通過する。アンロックはロックした回数だけ呼ぶことで開放できる。メソッドはNSLockと同じ。

この再帰ロックによって他のスレッドはブロックされているが長期間待たされる可能性がないように注意する。再帰ロックをなくすようにコードを改善することでパフォーマンスが向上できる。

NSCondition

条件変数

ロックが必要なクラス、必要でないクラス。

スレッドセーフ

基本的に不変オブジェクト

NSArray
NSAssertionHandler
NSAttributedString
NSCalendarDate
NSCharacterSet
NSConditionLock
NSConnection
NSData
NSDate
NSDecimal関数
NSDecimalNumber
NSDecimalNumberHandler
NSDeserializer
NSDictionary
NSDistantObject
NSDistributedLock
NSDistributedNotificationCenter
NSException
NSFileManager(OS X v10.5以降)
NSHost
NSLock
NSLog/NSLogv
NSMethodSignature
NSNotification
NSNotificationCenter
NSNumber
NSObject
NSPortCoder
NSPortMessage
NSPortNameServer
NSProtocolChecker
NSProxy
NSRecursiveLock
NSSet
NSString
NSThread
NSTimer
NSTimeZone
NSUserDefaults
NSValue
NSXMLDocument
NSXMLParser

ただし、不変オブジェクトを返すメソッド(例 NSString)でも可変オブジェクトを入れてくることがある(NSMutableString)ので、不変コピーを作る必要がある。

スレッドセーフでない

基本的に可変オブジェクト

NSArchiver(ラップ先にその可能性)
NSAutoreleasePool
NSBundle
NSCalendar
NSCoder(ラップ先にその可能性)
NSCountedSet
NSDateFormatter
NSEnumerator(ラップ先にその可能性)
NSFileHandle
NSFormatter
NSHashTable関数
NSInvocation
NSJavaSetup関数
NSMapTable関数
NSMutableArray
NSMutableAttributedString
NSMutableCharacterSet
NSMutableData
NSMutableDictionary
NSMutableSet
NSMutableString
NSNotificationQueue
NSNumberFormatter
NSPipe
NSPort
NSProcessInfo
NSRunLoop
NSScanner
NSSerializer(ラップ先にその可能性)
NSTask
NSUnarchiver
NSUndoManager

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5