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

标签 multithreading mutex semaphore thread-synchronization

我的要求如下

  • 有一个具有多个线程的进程。
  • 线程之一(T1)由用户事件
  • 触发
  • 有一个任务需要在单独的线程(T2)中完成,该任务应该由T1生成
  • 现在,T1应该检查系统是否尚未在T2中执行任务。如果不是,则应生成T2,然后退出。如果T2仍在运行,那么我应该通过记录错误从T1返回。在T2完成之前,我不想持有T1。
  • T2通常需要很长时间。因此,如果T1在T2完成之前被触发,则应该返回一个错误。
  • 在任何情况下都不打算使用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)
    

    而且这很好。但是我想知道是否有更简单的方法可以做到这一点。

    最佳答案

    不要使用这样的互斥锁。互斥锁应保持最短的时间。在这种情况下,有一个 bool 标志t2_running,它受互斥锁保护。在T1中:

  • 锁定g_mutex
  • 阅读t2_running
  • 如果设置了t2_running,请解锁g_mutex并退出,并显示错误
  • 设置t2_running
  • 解锁g_mutex
  • 填充T2的数据
  • Spawn T2
  • 等待g_semaphore
  • 成功退出

  • 然后,T2可以执行以下操作:
  • 读取数据
  • 信号g_semaphore
  • 处理数据
  • 锁定g_mutex
  • 清除t2_running
  • 解锁g_mutex
  • 退出
  • 关于multithreading - 在这种情况下如何设计线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925251/

    相关文章:

    multithreading - Scala:WAITING列表被填充

    java - 使用Java.Thread向MySQL数据库插入数据安全吗?

    c++ - 为什么 sleep 功能会禁用我的互斥体

    python - 在Python中使用threading.Semaphore()

    python - 消费者/生产者不等待事件

    java - 处理选择器键的最佳方法是什么?

    multithreading - 我应该使用哪种 boost 多线程设计模式?

    loops - 在迭代过程中同时修改 map 时如何使用RWMutex

    c - 线程永远不会获得锁(pthread_mutex_lock)

    无法识别 C++ 标准库头