0

マルチスレッドの基本的な概念しか知らないのですが、現在、助けが必要な状況に遭遇しています。

完了するタスクが 2 つあり、両方を継続的に実行する必要があります。問題は、最初のスレッドが最初にいくつかのジョブを実行した後にのみ、2 番目のタスクを開始する必要があるということです。現在、2 つのスレッド クラスは大まかに次のようになっています。

finished = False # shared flag 

class first(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        do_something()
        self.finished = True #change the flag
        self.cond.notify()
        self.cond.release()
        do_something_else()


class second(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        while self.finished == False:
            self.cond.wait()
        self.cond.release()
        do_something()

ただし、実際には、wait() と notify() に関係なく、プログラムは依然としてランダムに実行されます。誰でもこの問題で私を助けることができますか? ありがとう。

4

2 に答える 2

3

self.finishedinclass firstは global の値のコピーでありfinished、参照ではないため、self.finishedofとのライブ関係はありませんclass second

おそらく、グローバルQueueオブジェクト (threadingモジュールで使用するように設計されています) を作成する必要があります。両方のクラスがキューを参照し、最初のスレッドがキューにゴーアヘッド シグナルを書き込み、2 番目のスレッドがゴーアヘッドを読み取るまでブロックするようにします。

于 2012-04-02T23:20:56.080 に答える
1

同期を完全に回避できます。2 スレッドではなく 3 スレッドを使用します。

スレッド 1a は「何らかの仕事をして」終了します。スレッド 1b は 1a が終了した場所から開始し、スレッド 2 は独立して開始します。

(また、CPU を Python スレッドと効果的に共有できないことも知っていると思います。これらは、並列で待機する I/O にのみ適しています。CPU バウンドの並列化が必要な場合は、multiprocessingを使用します。)

于 2012-04-02T23:33:14.343 に答える