【问题标题】:C++ simple threading questionC++简单线程问题
【发布时间】:2011-09-22 20:15:12
【问题描述】:

我正在编写一个简单的生产者/消费者程序来更好地理解 C++ 和多线程。 在运行消费者的线程中,我有以下前两行:

    pthread_cond_wait(&storageCond, &storageMutex);
    pthread_mutex_lock(&storageMutex);

但是程序卡住了,可能是死锁了。 然后我换线了:

    pthread_mutex_lock(&storageMutex);
    pthread_cond_wait(&storageCond, &storageMutex);

它奏效了。 有人可以帮我理解为什么这有效而前者无效吗?

谢谢。

【问题讨论】:

    标签: c++ multithreading pthreads producer-consumer


    【解决方案1】:

    来自 pthread_cond_wait 手册页 (http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html):

    它们被调用线程锁定或未定义的互斥锁调用 行为将导致。

    我建议您使用一些好的包装库,例如 boost::threads,或者当您可以访问 C++11 时,您使用 std:: 线程工具。由于他们使用 RAII 之类的东西,因此更容易处理,尤其是在没有线程编程经验的情况下。

    【讨论】:

      【解决方案2】:

      这有点简化,但您基本上需要锁定您正在使用的互斥锁以执行条件等待 - 它就像多线程竞争条件保护。如果您需要详细说明原因,请查看带有“man pthread_cond_wait”的 UNIX 手册页,它提供了一个很好的长篇演讲:)

      pthread_cond_wait(&storageCond, &storageMutex); //Wants mutex you don't have locked.
      pthread_mutex_lock(&storageMutex);              //Get mutex after its too late.
      
      pthread_mutex_lock(&storageMutex);              //Get mutex first.
      pthread_cond_wait(&storageCond, &storageMutex); //Do cond wait with mutex you have.
      

      【讨论】:

        【解决方案3】:

        一旦线程从条件变量等待中恢复,它就会重新获取互斥锁。这就是第一个示例程序卡住的原因。

        这个想法是总是在互斥锁内部做一个 cond_wait()。 cond_wait() 将放弃锁并自动开始等待(这样您就不会错过来自另一个线程的 cond_signal() ),当发出信号时, cond_wait() 将重新获取互斥锁以确保您的关键部分只有一个线程在里面跑。

        HTH,这种锁定方案称为Monitor

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          相关资源
          最近更新 更多