|
2
|
| Arkaitz Jimenez · 技术社区 · 16 年前 |
|
|
1
4
一个信号量不能完成这项工作-您需要进行比较 (互斥+信号量) 和 (互斥+条件变量) . 通过尝试实现它,很容易看到这一点:
正如您所看到的,当您实际读/写队列时,没有互斥,即使存在(来自信号量的)信号。多个线程可以同时调用push并中断队列,或者多个线程可以同时调用pop并中断队列。或者,一个线程可以调用pop并删除队列的第一个元素,而另一个线程则调用push。 您应该使用您认为更容易实现的工具,我怀疑性能会有很大的变化(不过,度量它可能很有趣)。 |
|
|
2
0
我个人使用互斥体来序列化对列表的访问,并通过在套接字上发送一个字节(由socketpair()生成)来唤醒使用者。这可能比信号量或条件变量的效率要低一些,但它的优点是允许使用者在select()/poll()中阻塞。这样,如果消费者愿意的话,它也可以在数据队列之外等待其他事情。它还允许您在几乎所有操作系统上使用完全相同的排队代码,因为几乎每个操作系统都支持BSD套接字API。 伪代码如下:
|
|
|
3
-1
如果您希望同时允许多个用户使用您的队列,那么应该使用信号量。
互斥体一次只能“授权”一个用户。
这是主要的区别,您应该决定哪个解决方案适合您的需求。 但我会选择mutex方法,因为您不需要指定有多少用户可以获取您的资源。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |