在这种情况下如何设计线程同步

时间:2012-01-19 11:28:10

标签: multithreading mutex semaphore thread-synchronization

我的要求如下

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

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

    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)
    

    这很好用。但我想知道是否有更简单的方法。

1 个答案:

答案 0 :(得分:0)

请勿使用此类互斥锁。互斥锁应保持所需的最短时间。在这种情况下,有一个布尔标志t2_running,它受互斥锁保护。在T1中:

  1. 锁定g_mutex
  2. 阅读t2_running
  3. 如果设置了t2_running,请解锁g_mutex并退出并显示错误
  4. 设置t2_running
  5. 解锁g_mutex
  6. 填充T2的数据
  7. Spawn T2
  8. 等待g_semaphore
  9. 成功退出
  10. 然后

    T2可以这样做:

    1. 阅读数据
    2. 信号g_semaphore
    3. 处理数据
    4. 锁定g_mutex
    5. 清除t2_running
    6. 解锁g_mutex
    7. 出口