有关C ++中线程的一般问题

时间:2018-11-20 18:07:24

标签: c++ pthreads

线程安全方法的一般形式是:

COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/
  1. 原因如下:

    Type ThreadSafeClass::method (Argument arg
    )
    {
    pthread_mutex_lock(&lock_);
    
    while ( !this->isReady() )
        pthread_cond_wait(&someCond_,&lock_);
    
    Type toReturn = doCriticalSection(arg);
    pthread_cond_signal(&someOtherCond_);
    pthread_mutex_unlock(&lock_);
    
    return(toReturn);
    
    }
    

    一个绝妙的主意:

    while ( !this->isReady() )
        pthread_cond_wait(&someCond_,&lock_);
    
  2. 为什么在循环之后使用while循环很重要 if ( !this->isReady() ) pthread_cond_wait(&someCond_,&lock_); 打电话吗? 如果while循环早于 pthread_mutex_lock()通话?

  3. pthread_mutex_lock()调用的目的是什么? 至此,正在执行pthread_cond_signal()的线程已完成。什么 通话好吗?

  4. 为什么method()语句在 return(toReturn)打电话吗? 允许变量pthread_mutex_unlock()不受保护的是什么?

对于1,我认为这是因为如果我们使用“ toReturn”,则调用pthread_cond_wait()的线程可能会虚假地唤醒。

2 个答案:

答案 0 :(得分:1)

  1. 可能是线程已准备好但尚未安排的情况。因此,假设您有线程A(执行您的函数的线程),线程B和线程C。线程B持有该锁,并且一旦执行完毕,它将解除阻塞线程A,但是与此同时,线程C得到了调度(因为它具有更高的优先级),因此线程A现在应改为等待C。通过使用if,您将获得A和C之间的竞争条件,但是使用while,A将在恢复其正常执行之前重新检查该条件。
  2. 比赛条件再次出现。通过在循环外使用锁,可以确保线程在该条件下没有竞争条件。
  3. 可能有多个线程在等待该条件变量,并且它们处于阻塞状态。即使您的线程(让我们再次将其称为A)完成,所有等待的线程仍将保持阻塞状态。通过调用pthread_cond_signal,您将唤醒该条件变量的等待列表中的第一个线程。
  4. 一旦调用return,就无法释放任何保持的锁,因此最终将导致死锁。无论如何,您已经在互斥区域中设置了返回值。

答案 1 :(得分:0)

循环而不是单个测试的原因是等待条件变量受spurious wakeup的影响。也就是说,即使未发出条件变量,该等待也可能会返回。据我了解,OS人士坚持这一点,因为允许它可以简化条件变量的实现。