使用pthread_cond_wait的最佳情况

时间:2017-01-13 10:23:40

标签: c linux concurrency pthreads mutex

如果事件发生,我想要同步两个线程,我发现很多资源都建议在这种情况下使用importCommand.Parameters.Add("@TENSDATE", OdbcType.DateTime).Value = exportReader.IsDBNull(0) ? (object) DBNull.Value : DateTime.Parse(exportReader.GetValue(0).ToString()); 但是我没有看到使用pthread_condpthread_cond之间的区别mutexes

我们可以使用以下代码:

// thread 1 waiting on a condition
while (!exit)
{
   pthread_mutex_lock(&mutex); //mutex lock
   if(condition)
     exit =  true;
   pthread_mutex_unlock(&mutex);
}
... reset condition and exit

// thread 2 set condition if an event occurs
pthread_mutex_lock(&mutex); //mutex lock
 condition = true;
pthread_mutex_unlock(&mutex);

而不是:

//thread 1: waiting on a condition
pthread_mutex_lock(&mutex);
while (!condition)
    pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);

//thread 2: signal the event 
pthread_mutex_lock(&mutex);
condition = true;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

请你帮助我动摇我们必须使用的最佳做法/情况pthread_cond

1 个答案:

答案 0 :(得分:0)

您的第一个示例将一直旋转并使用CPU,而等待条件变量将暂停该过程并且它将不会运行直到条件变量发出信号。如果在第一个示例中,机器中只有一个CPU,则线程1也可能最终阻止线程2长时间运行,因此它甚至没有机会发出信号。

旋转是浪费CPU时间,浪费电力,最终可能会慢很多。

(你的第二个例子中确实有一个错误,但是我很确定在编写示例时这只是一个错误,这就是为什么它实际上是可以运行的好方法。在问题中测试的例子)