[解決済み】Objective-Cで@synchronizedのロック/アンロックはどのように行われるのですか?
2022-04-18 02:43:20
質問
synchronizedは相互排他を実現するために"lock"と"unlock"を使用しないのですか?その場合、lock/unlockはどのように行うのでしょうか?
次のプログラムの出力は "Hello World" だけです。
@interface MyLock: NSLock<NSLocking>
@end
@implementation MyLock
- (id)init {
return [super init];
}
- (void)lock {
NSLog(@"before lock");
[super lock];
NSLog(@"after lock");
}
- (void)unlock {
NSLog(@"before unlock");
[super unlock];
NSLog(@"after unlock");
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
NSLog(@"Hello World");
}
[pool drain];
}
解決方法は?
Objective-Cの言語レベルの同期にはmutexが使われており、ちょうど
NSLock
があります。意味的には細かい技術的な違いがありますが、基本的には共通の(より原始的な)実体の上に実装された2つの別々のインターフェースと考えるのが正しいでしょう。
特に
NSLock
では明示的にロックしているのに対し
@synchronized
の場合、同期に使用するオブジェクトに関連する暗黙のロックがあります。言語レベルのロックの利点は、コンパイラがそれを理解し、スコープの問題に対処できることですが、機械的には基本的に同じように動作します。
を考えることができます。
@synchronized
をコンパイラで書き換えたようなものです。
- (NSString *)myString {
@synchronized(self) {
return [[myString retain] autorelease];
}
}
が変換される。
- (NSString *)myString {
NSString *retval = nil;
pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self);
pthread_mutex_lock(self_mutex);
retval = [[myString retain] autorelease];
pthread_mutex_unlock(self_mutex);
return retval;
}
実際の変換はもっと複雑で、再帰的なロックを使用するので、これは正確ではありませんが、ポイントは伝わると思います。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] lockステートメントは、ボンネットの中で何をするのでしょうか?
-
[解決済み] NSStringをNSNumberに変換する方法
-
[解決済み】UITableViewからセパレータラインを削除する方法はありますか?
-
[解決済み】Swiftコンパイラーエラー。"フレームワークモジュール内の非モジュラーヘッダー"
-
[解決済み] registerForRemoteNotificationTypes: は iOS 8.0 以降でサポートされていません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】開発者の身元が確認できないため開けない
-
[解決済み] NSTaggedPointerStringをNSStringに変換する。
-
[解決済み] Objective-Cのnil、NIL、nullの違いについて
-
[解決済み] ブロック内の変数をブロック外の変数に代入する
-
[解決済み] 「NSString *' 型のパラメータに 'const NSString *' を送ると修飾子が破棄される」警告
-
[解決済み】キーボードを簡単に解除する方法は?
-
[解決済み】iOS 7で非推奨のsizeWithFont:の代わりになるものは?
-
[解決済み】Objective-Cの"@synchronized "に相当するSwiftは何ですか?
-
[解決済み】コンパイルの警告:アーキテクチャi386のファイルを処理するルールがない
-
[解決済み】Objective-Cでクラスレベルのプロパティを宣言するにはどうすればいいですか?