2016-10-15 4 views
0

NSLockを使用して私たちのログでこのメッセージを見て:これは、アプリケーションが致命的なエラーが発生したため、作業を停止することをスウィフト:理解NSLockのデッドロック

*** -[NSLock lock]: deadlock (<NSLock: 0x6100000cbec0> '(null)') 
*** Break on _NSLockError() to debug. 

を意味するのでしょうか?あるいは、これはある種の「優雅な」様式で扱われていますか?

+0

これは、[NSLock lock](この問題に関係するスレッドは返されませんが、これは悪いことです)を呼び出す場所にコードを投稿する必要があることを意味します。 – Tibrogargan

+0

デッドロックが発生している理由を理解しています私はコードを投稿しませんでした)。私の質問は、スウィフト/ NSLockがデッドロックをどう処理するかについてです。 –

答えて

2

デッドロック問題のスレッドは処理を続行できません。 Swiftはデッドロックを「処理」しませんが、これが発生したことを通知するだけです。

このデッドロックがアプリケーション内でどのように現れるかは、そのスレッドに関連付けられているコードが何をしていたかによって異なります。しかし、明らかに、それが何であれ、それは決して完了せず、そのスレッドのリソースは決して回復されません。このデッドロックがメインスレッドで発生した場合、アプリはフリーズします。

ボトムラインこのメッセージの目的は、デッドロックが処理されたことを示すのではなく、反対に、処理できないことを伝えることであり、したがって、この問題を解決するコードを修正してください。

1

スウィフトはここでの動作とは関係ありません。これはクラッシュではありません。ロックは再入可能なロックではないことに注意してください。既にロックを持っている間にlockを呼び出すと、デッドロックが発生します。メインスレッドがデッドロックされているか、または1つ以上のスレッドがバックグラウンドでデッドロックされて、データが到着していない、処理されていないタスクなどの未定義の動作を引き起こした場合、アプリケーションは停止しているように見えます。

関連する問題