2017-01-13 4 views
2

シンプルタイトルの状態です。基本的には、この例では、我々はこれまで、無効な状態を得ることができる:myBoolは、いくつかの無効な状態にあるため、SwoolでBoolアトミック操作を設定して読み取っていますか?

var myBool = false 

// Thread 1 
while true { 
    if randomEvent() { 
     myBool = true 
    } 
} 

// Thread 2 
while true { 
    if myBool { 
     print("Was set to true") 
    } else { 
     print("Not set") 
    } 
} 

は、この今までにクラッシュしてもらえますか?それともこの「安全」ですか?

答えて

1

Swift Usersメーリングリストで議論したところ、Bool値の読み書きはSwiftのアトミック操作ではないことが確認されました。さらに、上記のコードはコンパイラによって最適化されてもよく、myBoolはスレッド2のコンテキストで設定されないので、チェックを最適化することができます。 Swiftでこれを行う唯一の有効な方法は、GCDを使用して正しくマーシャリングするか、OS提供のロック機能を使用することです。

1

「スレッドセーフ」または「アトミック」、またはスウィフトとは何が関係していると思いますか。マルチスレッドの性質は次のとおりです。このフォームの何か言うたび:

if myBool { 
    print("Was set to true") 

を...あなたはmyBoolは別のスレッドで設定することができれば、それは最初の行と第二間に設定することができることを前提とすべきです。これにより、現在falseであるにもかかわらず"Was set to true"が印刷される可能性があります。逆の場合、逆ではなくは印刷されますが、現時点ではtrueです。

+0

はい、問題ありません。私が証明しようとしていることは、スウィフトでブールができる不思議な第三の状態はないということです。私はそれが最終的に "本当に設定された"とそれが決してクラッシュすることはありません印刷することを確認しようとしています。 –

+0

認めても、私はその答えを知らない。 Swiftはオープンソースなので、コードを解読しようと思っています。私は一般的に私の回答は、意図的に無制限のデータ共有をスレッド間で共有しようとしている場合、すべてのベットがオフであるということです。このようなコーナーを調べるよりも、「Do not Do That」ルールに従うだけの方が簡単ですか? – matt

関連する問題