1

ペアで呼び出される 2 つのタスクがあります。それらは個別のブロッキング I/O リソースと対話するため、個別のタスクであり、それらの 1 つ (TaskA) は、タスク ペアの前のインスタンスがまだ実行されているという条件で早期に終了しますが、TaskB は引き続き実行されます (つまり、TaskA はオーバーラップを考慮します)。タスク ペア、TaskB はありません)。

現在、クックブックの例に従ってキャッシュされたトークンを使用して、レイアウトされたルールを適用することを検討しています

def TaskA()
   take TaskA token
   exit if already taken
   check if TaskB token is taken
   exit if TaskB token is taken
   continue working

def TaskB()
   take TaskB token
   if token taken exit
   do task

これの問題は、TaskA と TaskB のペア内で、TaskB が最初に開始されると、TaskA が誤って終了することです。TaskA が常に最初に開始されるように強制できる場合は、おそらくこれで問題ありません。

それ以外の場合: これに関する私の考えは、両方のタスク インスタンスに渡す呼び出し関数で rand() またはタイムスタンプを生成することでした。TaskB インスタンスはそれを取得するトークンに追加し、TaskA はそれを使用して、rand 部分がそれ自体と一致する場合は TaskB トークンを無視し、トークンが取得されても、rand 部分が一致しない場合は終了します。

def TaskA(rand)
   take TaskA token
   exit if already taken
   check if TaskB_* token is taken
   exit if TaskB_not_rand token is taken
   continue working

def TaskB(rand)
   check TaskB_* token
   if TaskB_* token taken exit
   take TaskB_rand token
   do task

レイアウトされた問題を考えると、2 番目のバージョン (rand() を追加) で提案した方法でトークンを使用して、タスクを調整する正しい方法ですか? または、もっと簡単な方法があります。

問題が明確でない場合、またはタスクにこの操作基準がある理由について好奇心に燃えている場合は、さらに情報を追加できます。

4

1 に答える 1

1

ランダム/タイムスタンプを使用する代わりに、シーケンス番号を使用するとどうなりますか?

def TaskA():
  take TaskA_token
  exit if TaskA_token taken
  take TaskB_token
  if TaksB_token.sequence <= self.sequence:
    exit
于 2012-05-05T20:56:04.533 に答える