1

私は言語機能について熟考していて、次の機能がどの言語にも実装されているかどうか疑問に思っていました。

Mutex 内でのみオブジェクトにアクセスできることを宣言する方法。たとえばJavaでは、オブジェクトが同期ノイズブロックにあり、C#ではロックされている場合にのみ、オブジェクトにアクセスできます。

オブジェクトが Mutex ブロックの外で使用された場合、コンパイラ エラーが発生します。

何かご意見は?

アップデート

一部の人々は質問を誤解していると思います。オブジェクトをロックできるかどうかを尋ねているのではなく、ロック/同期ステートメント内からのみアクセスできることをオブジェクトの宣言時に述べるメカニズムがあるかどうかを尋ねています。

4

4 に答える 4

1

これには 2 つの方法があります。

プログラムは、保護ミューテックスが呼び出しスレッドによってロックされていない限り、メソッドの実行runtime checkを拒否します (これはです)。またはコンパイルを拒否します(それはcompile time checkです)。

最初の方法は何をするかC# lockです。

2 番目の方法では、可能なすべての実行パスを評価できるコンパイラが必要です。それはほとんど実現不可能です。

于 2009-02-03T13:03:02.980 に答える
0

説明したようにすべてのロックを要求すると、デッドロックの可能性が生じます。そうでない場合よりも早くロックを強制される可能性があるためです。

とはいえ、あなたが説明したものと同様のアプローチがあります-特にSoftware Transactional Memoryは、ロールバックと再試行を許可することでデッドロックの問題を回避します。

于 2009-08-06T04:03:52.570 に答える
0

Java ではメソッドにキーワードを追加できますがsynchronized、それはメソッド本体全体をsynchronized(this)-block (非静的メソッドの場合) でラップするための構文糖衣にすぎません。

そのため、Java の場合、その動作を強制する言語構造はありません。.wait()呼び出し元のコードがモニターを取得したことを確認するために、タイムアウトをゼロにしてこれを試すことができますが、それは事後チェックにすぎません

于 2009-02-03T12:58:51.757 に答える
0

Objective-C では、ディレクティブ@property@synthesizeディレクティブを使用して、コンパイラにアクセサーのコードを生成させることができます。デフォルトでは、ミューテックスによって保護されています。

于 2009-02-03T13:00:46.353 に答える