- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在实现一个基于 std::queue 的 C++ 消息队列。
因为我需要 popers 在空队列上等待,所以我考虑使用 mutex 进行互斥,并使用 cond 在空队列上挂起线程,就像 glib 对 gasyncqueue 所做的那样。
但是在我看来,互斥量和信号量可以完成这项工作,我认为它包含一个整数,而且对于处理未决消息而言,这似乎是一个相当高的数字。
信号量的优点是您不需要每次从等待返回时手动检查条件,因为您现在可以确定有人插入了一些东西(当有人插入 2 个项目并且您是第二个到达的线程时)。
你会选择哪一个?
编辑:更改了问题以回应@Greg Rogers
最佳答案
单个信号量不能完成这项工作 - 您需要比较(mutex + semaphore) 和(mutex + condition variable)。
通过尝试实现它很容易看出这一点:
void push(T t)
{
queue.push(t);
sem.post();
}
T pop()
{
sem.wait();
T t = queue.top();
queue.pop();
return t;
}
如您所见,当您实际读取/写入队列时没有互斥,即使信号量(来自信号量)存在。多个线程可以同时调用 push 打断队列,也可以多个线程同时调用 pop 打断队列。或者,一个线程可以调用 pop 并删除队列的第一个元素,而另一个线程调用 push。
您应该使用您认为更容易实现的任何一个,我怀疑性能是否会有很大差异(尽管测量可能很有趣)。
关于c++ - 什么对消息队列更好? mutex & cond 还是 mutex & semaphore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466940/
请检查我对信号量的理解! 我理解计数信号量和二进制信号量背后的想法。然而,用 signal() 和 wait() 实现的自旋锁和信号量之间的区别对我来说有点混合在一起。 例如,自旋锁基本上有两个值(用
有人问我是否可以使用以下功能: void down(struct semaphore* sem); int down_intterruptible(struct semaphore* sem); 仅来
我创建了一个小型电影租赁模拟程序。它的工作原理如下:- 主线程让用户输入客户姓名 每个输入的客户都会启动一个新线程(Customer Runnable) 创建 5 个客户后,租赁服务开始(正在等待 5
我被要求编写测试用例来实际展示信号量和读写信号量在读者多而写者少的情况下的性能,反之亦然。我已经实现了信号量(在内核空间中我们实际上被问到)但不知道如何编写用例并对其进行现场实际评估(明确地)。 最佳
在 Java java.util.concurrent.Semaphore 文档中,我不太清楚如果 semaphore.acquire() 阻塞线程并随后被 InterruptedException
信号量是满足有限等待还是只是为了提供互斥? 最佳答案 答案 正如您将在下面看到的那样,理论上它可能会打破有界等待条件。实际上,它在很大程度上取决于使用哪种调度算法。 wait()的经典实现和 sign
我唯一理解的是 信号量是一种原始方式 关键区域有一个 GUARD 变量(信号量也有,但名称不是 GUARD!) ?? 那么有什么区别呢? 最佳答案 通常,临界区域是一个地方,如果存在两个单独的执行线程
我们有 3 个任务以不同的优先级运行:A (120)、B (110)、C (100)。A 采用带有反转安全标志的互斥信号量。任务 B 执行 semTake,这导致任务 A 的优先级提升到 110。随后
尝试构建我的 React 应用程序,但遇到此编译错误: /Users/jimvercoelen/Documents/bitbucket/inboundmuse-client/node_modules/
似乎 glib 提供互斥体和条件作为线程同步原语,但通用 semaphores 怎么样? (从某种意义上说,它们支持原始的 P 和 V 操作?)我对 GCond 的理解是否正确?相当于一个二进制信号量
我们有 3 个任务以不同的优先级运行:A (120)、B (110)、C (100)。A 采用带有反转安全标志的互斥信号量。任务 B 执行 semTake,这导致任务 A 的优先级提升到 110。随后
一般情况下如何用信号量来描述八个进程的同步上面的优先图? 最佳答案 p1 p2 p3 p4 p5 p6 p7
我正在阅读“操作系统概念”中有关信号量的内容(对于那些了解它的人),并且我认为我完全理解了信号量,直到我阅读了这段话: The critical aspect of semaphores is tha
JUC同步锁原理源码解析四----Semaphore Semaphore 1.Semaphore的来源
Semaphore 是什么 Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。 可以把它简单的理解成我们停车场入口立着的那个显示
如何在第一次测试失败时中断所有 Cypress 测试? 我们正在使用 semaphore 为每个 PR 使用 Cypress 启动完整的 e2e 测试。但这需要太多时间。 我想在第一次测试失败时中断所
有人知道为什么将信号量操作称为P和V吗?每次阅读有关信号量的章节时,都会显示如下内容: 为了使线程获得资源,它执行P操作。为了使线程释放资源,它执行V操作。 P和V代表什么?为什么它们不被称为等待和信
我正在尝试在python中使用信号量,但无法使其按我想要的方式工作。 我有以下代码: import os import threading import time sem = threading.Se
有什么办法可以找到吗 有多少线程在等待信号量? 当前有多少线程占用了信号量? 如果我使用线程池线程等待信号量,如何让主线程等待线程池线程完成。 谢谢。 最佳答案 这是线程同步中的禁忌知识。因为完全不可
我们可以通过 availablePermits() 获得剩余许可 如何在运行时获取 usedPermits() 或 maxPermits(例如,最大许可从 db 加载并且 db 值可能在信号量创建后发
我是一名优秀的程序员,十分优秀!