【发布时间】:2012-12-14 20:19:30
【问题描述】:
我的程序根据行的字段之一在不同的线程中处理数据库行。 主线程产生“工人”,执行查询,然后,对于每一行,需要唤醒所有工人,以便其中一个消耗该行。
现在,使用 pthread_cond_broadcast() 似乎是最合乎逻辑的选择。但是,在这种情况下,工作人员必须都在 pthread_cond_wait() 中等待使用相同的互斥锁。
在我的情况下这是次优的,因为这意味着,工人将被唤醒一次(我不需要)——而不是一次时间>。是的,我确实希望他们全部醒来——他们都会从新的 DB 行中读取一个字段,之后除了一个字段之外的所有字段都将返回等待下一行。我不需要同步它们。
我想,我会在每个线程中使用带有 pthread_cond_wait() 的虚拟线程特定互斥锁,但这不起作用(只唤醒了一个线程)。 standard 说,使用不同的互斥锁等待相同的条件变量(就像我一样)是未定义的。
那么,有没有办法一次通知所有线程?谢谢!
【问题讨论】:
-
您是否试图让工作人员找出真正需要唤醒的人(基于行数据)?为什么不让主线程找出正确的工作线程并将数据排队呢?
-
是的,工人们要弄清楚,他们中的哪一个会接受这份工作。我宁愿不在主线程中这样做,因为那样我需要循环比较,而工作线程只需要每个执行一个比较。
-
你不能使用哈希表或二分搜索(而不是线性搜索)来找出收件人吗?无论如何,除非您拥有与 worker 一样多的内核,否则不会并行进行比较(并且由于上下文切换,这可能比循环还要慢)。
-
是的,我可以使用哈希表或树——但这仍然比简单地让每个工作人员执行一次比较慢。我的计算方式是在 O(1) 时间内完成的。对于散列或树,它仍然是 O(log(n))。
-
"big-O" 是狡猾且具有误导性的。对于较小的 n 值,一个操作大约需要 30 个周期的 O(log(n)) 远远好于一个操作需要几千个周期的 O(1)。另请注意,您的 O(1) 实际上是“n 个不同线程/CPU 上的 O(1)”,这对我来说听起来很像 O(n)。