0

コードには 2 つのセクションがあります。

section_a

# some code

section_b

section_bが実行されている場合にのみ、 section_aをブロックする必要があります。section_bにブロックがない場合、section_aは多くのスレッドで実行できます。

section_bの実行が開始されたら、他のスレッドにシグナルを送信して、section_aに入らないようにする(その前に待機する) 必要があります。そして、最後のスレッドが section_a を離れると、section_b実行する必要があります。

条件付きロック (threading.Condition.acquire()、threading.Condition.release()) を使用して問題を解決する場合、多くのスレッドが同時にsection_aに入るのを許可する方法がわかりません。section_aの前に condition.acquire() を呼び出すと、他のスレッドもブロックされてセクションに入ります。

while True:

    condition.acquire() # other threads that would enter point_a can't do that after this acquire()
    #section_a, point_a
    condition.release()

# another place of a program
while True:
    condition.acquire() # I'd like threads can't enter section_a after this acquire, but not after acquire before point_a
    #section_b
    condition.release()

また、 section_aがスレッドによって実行される場合は、section_bをブロックする必要があります。

正しい構造を教えてください。

すみません、私はマルチスレッドの経験がありません。おそらく、まったく別の構造があります。

4

1 に答える 1

1

threading2SHLockから (共有ロック) を使用できます。

このacquireメソッドはsharedパラメーターを取り、 as として渡されtrueた場合は共有モードでロックし、 as として渡されたfalse場合は排他モードでロックします。

あなたの例では、acquiresection_a に入るときに共有モードで呼び出します。これにより、任意の量のスレッドが section_a に入ることができます。section_b に入ると、排他モードでロックされ、同時共有モード ロックが防止されます (つまり、ロックを保持しているときに誰もが section_a に同時に入ることはできません)。

于 2013-02-02T18:24:33.773 に答える