Python でビンテージ コンピューター システム用のエミュレーターを作成していますが、停止状態から抜け出した後にエミュレーター コア スレッドを「再起動」しようとすると、例外がスローされて問題が発生します。より大きなクラスの一部である「プロセッサの実行」メソッドは、次のようになります。
def run_processor(self):
processor = self
class processor_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
def run(self):
while processor.running:
#main loop for instruction fetch and decode is here
self.processor_thread = processor_thread()
self.running = True
self.processor_thread.start()
メモリ イメージをプロセッサにロードし、プログラム カウンタを設定し、エミュレータでテスト プログラムを実行するメイン関数があります。これによりコンソールに何らかの出力が行われ、最終的にプロセッサの「HLT」命令によって「processor.running」が False に設定され、processor_thread が終了します。
これは問題なく動作しますが、run_processor をもう一度呼び出してプロセッサを再起動するテストで問題が発生しています。
processor = Processor(memory, scheduler, interrupts, teleprinter)
processor.program_counter = 128
processor.run_processor()
while processor.processor_thread.isAlive():
pass
processor.program_counter = 128
processor.run_processor()
最初のインスタンスは正常に実行されますが、run_processor メソッドが 2 回目に呼び出されると、次のエラーが発生します。
スレッド Thread-3 の例外 (インタープリターのシャットダウン中に発生する可能性が最も高い)
どうすればこれを修正できますか? ありがとう。
編集:コードを必要最小限に分解したところ、実際に問題なく動作することがわかりました。私の HALT メソッドが実際には、テレプリンター エミュレーターを実行するスレッドを含むすべてのプロセッサ周辺スレッドをシャットダウンするように記述されていることに気付きませんでした。出力するテレプリンターがないと、2 番目のテストでエミュレーター コアがクラッシュしたように見えます。
テストケースは次のとおりです。
import threading
import time
class Processor(object):
def __init__(self):
self.running = False
def halt_processor(self):
self.running = False
def run_processor(self):
processor = self
class processor_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
def run(self):
while processor.running:
#main loop for instruction fetch and decode is here
print "Hello, I am the main loop doing my thing 1"
time.sleep(1)
print "Hello, I am the main loop doing my thing 2"
time.sleep(1)
print "I will halt now."
processor.halt_processor()
self.processor_thread = processor_thread()
self.running = True
self.processor_thread.start()
def test1():
processor = Processor()
processor.run_processor()
def test2():
processor = Processor()
processor.run_processor()
while processor.processor_thread.isAlive():
pass
processor.run_processor()
def main():
test2()
if __name__ == '__main__':
main()
正常に動作します。