import time
import threading
class test(threading.Thread):
def __init__ (self):
threading.Thread.__init__(self)
self.doSkip = False
self.count = 0
def run(self):
while self.count<9:
self.work()
def skip(self):
self.doSkip = True
def work(self):
self.count+=1
time.sleep(1)
if(self.doSkip):
print "skipped"
self.doSkip = False
return
print self.count
t = test()
t.start()
while t.count<9:
time.sleep(2)
t.skip()
答えて
どのようにしてスレッドセーフですか?私はあなたがここで保護したいと思わない部分は見ません。
スキップすると、いつでもdoSkip
がリセットされる可能性があります。したがって、ロックするにはあまり意味がありません。あなたは同時にアクセスされるリソースを持っていないので、このコードでIMHOは何も壊れたり危険になることはありません。
ロック/カウントによって異なって実行される部分は、.skip()
へのすべての呼び出しで「スキップ」がいくつ行われるかだけです。すべてのスキップでスキップされた結果が.work()
になるようにするには、doSkip
を増分と比較/減分の両方のロックによって保護されているカウンタに変更する必要があります。現在、チェックの後でdoSkip
がリセットされる前に、1つのスレッドがdoSkip
をオンにする可能性があります。この例では重要ではありませんが、実際の状況では(コードを増やすことで)差が出る可能性があります。
明らかに重要なリソースはないので、スレッドセーフです。
しかし、通常どおり、2つのスレッドがスケジューラによってブロック/実行される順序を予測することはできません。
スレッド間でデータを共有しない限り、これはスレッドセーフです。
スレッドクラスにデータを読み書きする必要がある場合は、同期メカニズム(ロックなど)でデータを保護しない限りスレッドセーフではありません。
mutexブール値のテスト(たとえばif(self.doSkip))がmutexブール値のセットとは別の場合は、おそらくスレッドの問題が発生します。
最も不便な時間にスレッドがスワップアウトされるというルールがあります。つまり、テストの後、セットの前に。それらを互いに近づけて動かすことは、ネジアップの窓を減少させるが、それらを排除するものではない。ほとんどの場合、そのウィンドウを完全に閉じるために、言語またはカーネルから特別に作成されたメカニズムが必要です。
スレッディングライブラリには、スレッドの同期やコードのクリティカルセクションの作成に使用できるセマフォがあります。 DanMの答えについては詳しく説明し
は、おそらくこれが起こる可能性:
- スレッド1:
t.skip()
- スレッド2:
if self.doSkip: print 'skipped'
- スレッド1:
t.skip()
- スレッド2:
self.doSkip = False
- など。
つまり、t.skip()
へのすべてのコールで1つの「スキップ」が発生することが予想されるかもしれませんが、この一連のイベントはそれに違反します。
しかし、sleep()
コールのため、この一連のイベントは実際には不可能だと思います。
(コンピュータがゆっくり本当にを実行している場合を除く)
- 1. このjqueryコードは安全ですか?
- 2. このJavaScriptコードは安全ですか?
- 3. これはPythonタイマーの使用は安全ですか?
- 4. このPHPコードはログインシステムに安全ですか?
- 5. このSQLコードは並行して安全ですか?
- 6. Javaコード、安全であること
- 7. このhtmlヘルパースレッドは安全ですか?
- 8. このログインスクリプトは安全ですか?
- 9. このシナリオは安全ですか?
- 10. このファイルアップロードスクリプトは安全ですか?
- 11. この機能は安全ですか?
- 12. このコードでは安全でないものは何ですか?
- 13. 安全なPythonインタープリタ?
- 14. このコードはSQLインジェクションから安全ですか? (そして理由)
- 15. iOS:コードでAESキーをハードコードするのは安全ですか?
- 16. Pythonマルチプロセッシングパイプが安全でないのはなぜですか?
- 17. Pythonの例外安全性の状態は何ですか?
- 18. PythonのRequestsライブラリスレッドのセッションオブジェクトは安全ですか?
- 19. Python Tornadoチャットのデモアプリケーションスレッドは安全ですか?
- 20. JDBCは安全ですか?
- 21. window.screenは安全ですか?
- 22. カピストラーノは安全ですか?
- 23. StrToInt()は安全ですか?
- 24. PhoneGapは安全ですか?
- 25. signed_requestは安全ですか?
- 26. HttpUtility.HtmlEncodeは安全ですか?
- 27. "User.Identity.Name"は安全ですか?
- 28. SecureStringは安全ですか?
- 29. Flex:removeEventListenerは安全ですか?
- 30. ユートピアでの単純なユーザーチェックは、これは安全ですか?