有什么优点/缺点使用 pthread_cond_wait 或者使用一个信号?我在等待一个国家改变这样的:

pthread_mutex_lock(&cam->video_lock);
while(cam->status == WAIT_DISPLAY) {
    pthread_cond_wait(&cam->video_cond, &cam->video_lock);
}
pthread_mutex_unlock(&cam->video_lock);

使用正确的初始化信号,我认为我能做这样的:

while(cam->status == WAIT_DISPLAY) {
    sem_wait(&some_semaphore);
}

有哪些优点和缺点的各种方法?

有帮助吗?

解决方案

一个信号,是适应能干净的生产者-消费模式,虽然也有其他用途。你的计划的逻辑是负责确保正确的数额是由于数量的等待。如果你发布一个信号,没有人等待它,然后当他们等待他们继续。如果你的问题是这样的,它可以被解释的条款的数值中的一个信号,那么它应该很容易解决与一个信号。

情况变量是多一点的宽容在某些方面。例如,可以使用cond_broadcast醒所有服务生,不生产者知道有多少。如果你cond_signal一condvar有没有人在等待它,然后什么也没有发生。这是很好的如果你不知道是否会有一个听众感兴趣。这也是为什么听者应该始终检查的国家与互斥举行之前等待-如果他们不那么他们可以错过一个信号,而不醒来,直到下一个(其中可能永远不会).

所以情况变量是合适的通知感兴趣的缔约方国家已经改变:你获得锁,变化状态,信(或广播)的condvar和释放的互斥。如果这描述了你的问题你在condvar领土。如果不同的听众都有兴趣在不同的国家可以只是广播和他们每一个又醒来,图找出他们是否已经发现的状态下他们想要的,并且如果不等。

这是非常麻烦的事实上尝试这种事情有一个互斥和信号灯。问题是当你想要采取锁,检查一些国家,然后等待信号灯变化。除非你可以原子释放的互斥和等待信号灯(其在这你不能),则最终在等待信号量,同时保持互斥。这块互斥,这意味,他人不能把它做的改变。所以你会被诱惑加入另一个互斥的方式,这取决于您的具体要求。也许另外一个信号。结果一般是不正确的代码有害的竞争条件。

条件变量逃避这个问题,因为调cond_wait自动释放锁,释放它使用的其他人。互斥是恢复之前cond_wait返回。

请参考它能够实施一种condvar仅使用的信号,但是如果互斥你在执行去condvar需要具有trylock,然后这是一个严重的头部-国际象棋和计时等待。不建议。所以不要以为你可以做任何事情有condvar可以做到的与信号灯。再加上当然互斥可以有好的行为这一信号灯的缺乏,主要优先事项的反避税行为。

其他提示

条件让你做一些事情,信号灯不会。

例如,假设有一些代码需要一个互斥,被称为 m.然而,它需要等到其他一些线已经完成他们的任务,所以它在等待一个信号叫 s.现在的任何线需要 m 是阻止运行,尽管螺纹而已 m 在等待 s.这种情况下,可以解决的使用条件。当你等上一个条件,互斥目前举行的释放,因此其他线可以获得的互斥。所以回到我们的例子,假设条件 c 是用来代替 s.我们的线现在获取 m, ,然后有条件的等待 c.这个版本 m 所以其他的线可以继续进行。时 c 变成可用, m 是重新获得和我们原来的线可以继续欢快地沿着它的方式。

有条件的变量也允许你让 所有 线上等待一个有条件的变量继续通过 pthread_cond_broadcast.此外,它还允许执行 计时等待 这样你就不会结束等待,直到永远。

当然,有时你不需要有条件的变量,因此,根据你的要求,一个或另一个可能更好。

第2段是活泼的,不这样做。

其他的答案有一个很好的讨论的相对优点;我只会增加, pthread_cond_broadcast 是一个明显的优势条件的变量。

除此之外,我只是更多的使用条件的变量,因为他们是你用什么,甚至因为它们有助于避免种族当检查的共同标志。

事实上,在第2段你没有任何锁定了保护阅读的凸轮>状态,所以它访问过的数据的比赛。大多数平台会让你得逞,在这个特定例子,但未定义的语义,通过POSIX和通过存储器模型的下一C/C++的标准。

事实上,一个真正的赛的条件是可能的,如果另一个线分配一个新的凸轮结构和复盖凸轮;在等待线可能会看到更新的'凸轮'指没有看到的初始化凸轮>状态。事实上,第2段要求的麻烦,在这种情况下并在一般情况。

http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/

在你的第二段,你要锁众多的时间,从未释放。

在一般情况下,在状态你waintin在可以完全表达的一个信号,然后可以使用。锁的结构规模较小,并且它需要较少的原子操作检查/设置/释放。

否则,如果国家是复杂的,并不同部分的代码等待在不同的条件的同一变量(例如,在这里,你想x<10;有你想要的y>x)使用cond_wait.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top