0

Objective-Cでシングルトンクラスを設計しています。これは複数のスレッドからアクセスされます。私のクラスには3-30 NSMutableArrayがあります。クラス外ではのアクセス権があります。オペレーションを読んだり追加したり削除したりできますが、もちろんこのクラスでラップされます。可変配列アクセスで@synchronizedディレクティブの普及に代わる方法

NSMutableArrayはスレッドセーフではないため、私は@synchronized()ブロックを使いすぎても操作を安全にするために@synchronized()を使用しています。

それぞれ3〜4個の配列のために、私は少なくとも1つの関数を追加しているので、1つは関数を削除し、5つは値を読み取る必要があります。だから、私は少なくとも1つの@synchronized()ブロックを使用している1アレイの。 4アレイの場合、私のシングルトンクラスにブロックを追加する必要があります。

私の問題にアプローチする方法はありますか? また、これらの指示文をあまりにも多く使うと、問題が起きますか?

オブジェクトをスレッドセーフにしたいのであれば、コードが遅くなりますが、それ以外にも欠点はありますか?

+1

1)シングルトンがスレッドセーフな場合は、おそらくデータメンバ_NSMutableArray_について心配する必要はありません。 2)あなたはデータメンバーの_atomic/nonatomic_属性を聞いて使用しているに違いありません。前者はスレッドセーフです。セキュリティを強化するために、_NSMutableArrays_をアトミックに宣言することができます。 – Adeel

+1

もう1つの方法は、各アレイに対してシリアルディスパッチキューを作成することです。その後、配列更新メソッドの関連キューにアレイ更新を同期的にディスパッチできます。 @Adeelは、NSMutable配列プロパティをアトミックにしても基本配列のスレッドセーフではなく、単にプロパティ自体を作成します。 – Paulw11

+1

@Adeel:mutableオブジェクト型のプロパティにatomic属性を使用すると、突然mutationsを同期させることはありません。スレッドセーフではありません。 1つのことと1つのことだけを行います。ゲッターとセッターが中断されないようにします。それ以降はオブジェクトがどうなっても制御されません。 –

答えて

2

通常、プリミティブ呼び出し(CRUD)を同期させてスレッドの安全性を確保するのに十分なのは、ではなく、です。このきめ細かいレベルは単なる基本的なものですが、よりグローバルなレベルで考える必要があり、より多くのコードを「霧化」する必要があります。これを行う方法は、実際の実装に大きく依存しています。マルチスレッドは悪い(tm)、包括的な見方を必要とするため、一般的な答えはありません。

同期化されたブロックは、通常、あまりにも頻繁に呼び出されると、アプリケーションの速度を低下させます。ロックオーバーヘッドを避けるために、1つの同期ブロックに複数のコールをグループ化する方がよい場合もあります。また、不要なタスクの中断を防ぐために、コールが非常に短い場合はスピンロックを使用できます(here for an old question/answerを参照)。

詳しくはApple documentationをご覧ください。

+0

私は客観的なcで新しいです、私はLinuxで働いて、スピンロックを行い、客観的なc mutexはpthread_mutex_lockに似ていますか? ** synchronized **とpthread_mutex_lockは、同じスレッドまたは関数呼び出しスタック内でpthread_mutex_lockがロックできる同じスレッドまたは関数スタック内のコードをロックしないので、トレードオフがあります。 **同期された**の別の利点があります。ブロック内でいつでも**返信**を使用できます。自動的にロック解除されます。しかし、pthread_mutex_lockを使用すると、あなたが条件のどれかを逃した場合、それはあなたの人生の地獄になります。 –

+1

私は詳細はすでにここにanseredと思う:http://stackoverflow.com/questions/9463525/pthread-mutex-t-vs-synchronized-block - スピンロックは全く異なるため、原因は「アクティブ」なので、待っているだけです非常に短い通話でお勧めします。 –

+0

あなたの答えをありがとう。すみません、私はスピンロックが悪いアイデアになるiOSについて言及するのを忘れました。私のシナリオでは、あなたが示唆したように、再帰的なミューテックスがより適切であると思います。 –

関連する問題