2

我的要求如下

  1. 有一个具有多个线程的进程。
  2. 其中一个线程 (T1) 由用户事件触发
  3. 有一个任务需要在一个单独的线程(T2)中完成,它应该由 T1 产生
  4. 现在,T1 应该检查系统是否已经在 T2 中执行任务。如果不是,那么它应该生成 T2 然后退出。如果 T2 仍在运行,那么我应该通过记录错误从 T1 返回。我不想在 T2 完成之前持有 T1。
  5. T2 通常需要很长时间。因此,如果 T1 在 T2 完成之前被触发,它应该只是返回一个错误。
  6. 意图是在任何情况下我们都应该有两个 T2 线程

我正在使用互斥锁和信号量来执行此操作,但可能有更简单的方法。这就是我所做的。

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

不要使用这样的互斥锁。互斥锁应保持必要的最短时间。在这种情况下,有一个布尔标志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 回答