2

私の要件は次のとおりです

  1. 複数のスレッドを持つプロセスがあります。
  2. スレッドの 1 つ (T1) は、ユーザー イベントによってトリガーされます。
  3. 別のスレッド (T2) で実行する必要があるタスクがあり、T1 によって生成される必要があります。
  4. ここで、T1 は、システムが T2 のタスクをまだ実行していないことを確認する必要があります。そうでない場合は、T2 を生成してから終了する必要があります。T2 がまだ実行されている場合は、エラーをログに記録して T1 から戻る必要があります。T2 が完了するまで T1 を保持したくありません。
  5. 通常、T2 には長い時間がかかります。したがって、T2 が終了する前に T1 がトリガーされた場合、エラーが返されます。
  6. T2 のスレッドを 2 つ持つべきではないという意図はありません。

これを行うためにミューテックスとセマフォを使用していますが、もっと簡単な方法があるかもしれません。これが私がすることです。

Mutex  g_mutex;
Semaphore  g_semaphone;

T1:

if TryLock(g_mutex) succeeds // this means T2 is not active.
spawn T2
else  // This means T2 is currently doing something
return with an error.
wait (g_sempahore) // I come here only if I have spawned the thread. now i wait for T2 to pick the task
// I am here means T2 has picked the task, and I can exit.

T2:

Lock(g_mutex)
signal(g_semaphore)
Do the long task
Unlock(g_mutex)

そして、これはうまくいきます。しかし、これを行うより簡単な方法があるかどうか知りたいです。

4

1 に答える 1

0

このようなミューテックスを使用しないでください。Mutex ロックは、必要最小限の時間保持する必要があります。この場合、t2_runningミューテックスによって保護されているブール値のフラグを設定します。T1 で次のことを行います。

  1. ロックg_mutex
  2. 読んだt2_running
  3. t2_runningが設定されている場合は、ロックを解除g_mutexしてエラーで終了します
  4. 設定t2_running
  5. ロック解除g_mutex
  6. T2 のデータを入力する
  7. スポーン T2
  8. を待つg_semaphore
  9. 成功して終了

その後、T2 は次のことを実行できます。

  1. データを読む
  2. 信号g_semaphore
  3. データを処理する
  4. ロックg_mutex
  5. クリアt2_running
  6. ロック解除g_mutex
  7. 出口
于 2012-01-19T14:14:16.173 に答える