问题标签 [semaphore]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 单个java信号量死锁?
在我最近的一个答案中,我给出了一个限制访问内存资源的理论信号量示例:
如果分配交错不好,我认为这可能是死锁的根源:
我的观察是真的吗?如果是,我怎样才能避免这种情况(例如定时等待和回滚)?
java - 信号量是如何工作的?
信号量可以小于0吗?我的意思是,假设我有一个 N=3 的信号量,我调用了 4 次“down”,那么 N 将保持为 0,但一个进程会被阻塞?
反之亦然,如果一开始我叫,N能大于3吗?因为正如我所看到的,如果 N 可以高于 3,如果一开始我调用了几次,那么稍后我可以调用比我可以调用的次数更多,从而将更多的进程放在关键部分,然后信号量允许我.
如果有人能为我澄清一下,我将不胜感激。
格雷格
semaphore - 如何知道哪些进程打开/使用特定的信号量?
我们有一个由 281 个进程打开的信号量,有没有办法获取这些进程的所有 pid?
ipcs -a|grep 67108878
s 67108878 0xcef73014 --ra-ra---- oracle dba oracle dba 281 17:54:58 9:27:30
multithreading - 正确销毁命名的 System V 信号量
我正在使用命名的 System V 信号量来锁定我在 OSX 和 linux 上的所有应用程序中的文件。无论如何定义都不是最漂亮的 API。
它似乎有效,但我不太清楚在每个人都完成后如何正确销毁信号量。
一般逻辑是这样的:
创建:
[1] 线程或进程尝试使用 ftok() 为文件创建的 key_t 打开一个信号量集。Set 包含 2 个信号量。[2] 如果信号量集不存在,则使用 666 权限创建。[3] “锁定”(信号量之一)设置为释放状态(值 1)。[4] “引用计数”(同一集合中的另一个信号量)递增。
锁定/解锁:
要锁定 [5],线程将“Lock”信号量的值减 1(撤消),因此如果它已经为零,则等待。为了解锁 [6],线程将其加一,从而允许其他人锁定它。
销毁:
[7] 尝试减少“引用计数”信号量(使用 IPC_NOWAIT 标志)。[8] 检查其值为0,如果为[9],则销毁信号量集。
(还有一层基于线程本地存储的逻辑,使锁在一个线程内递归。)
问题是:
- 如何同步步骤 [1] 和 [2]?(如果信号量集不存在,但是当我们计算星星时,它是由其他人创建的,所以现在创建也会失败)
- 如何将步骤 [4] 与 [8] 同步,以便 [9] 不会过早杀死我?
- 还有其他比赛条件吗?
PS:虽然 POSIX 信号量有更好的 API,但我认为我无法在此处描述的 sem_inlink() 行为中幸存下来:
调用 sem_open() 以重新创建或重新连接到信号量是指调用 sem_unlink() 后的新信号量。
所以我没有办法释放他们......
multithreading - sem_init(...): pshared 参数是干什么用的?
在研究生课程中,我们不得不使用信号量来完成线程工作。
我们被指示sem_init
与一堆其他 sem_* 程序一起使用,但我们没有得到关于每个 sem_* 方法的详细信息的太多信息。
的原型(和头文件)sem_init
如下:
但我不明白 pshared 值的用途。根据opengroup.org:
如果
pshared
参数具有非零值,则信号量在进程之间共享;在这种情况下,任何可以访问信号量的进程都sem
可以sem
用于执行sem_wait()
、、、sem_trywait()
和操作。sem_post()
sem_destroy()
但我想我不明白 1,2、10、25、50000 等之间的区别。我认为这是说如果值为 0 则不共享信号量。(但是,有什么意义呢?)
如何正确使用此pshared
参数?
linux - 多进程同步 - 比信号量更好的选择?
我有一个在多个生产者和多个消费者之间共享的队列资源。都是独立的进程;没有一个进程“拥有”队列。
根据实现的性质,必须控制对队列的访问,并且在任何给定时刻只能允许一个进程推送或弹出。
我认为使用名为 semaphore 的 POSIX 将是正确的解决方案,但是其中一些细节困扰着我。(顺便说一句,这是一个仅限 Linux 的实现。)
什么时候(如果有的话)我应该做一个 sem_unlink?是否有任何理由实际删除队列?
我担心在锁定队列信号量时进程会死机。有什么好办法解决这个问题吗?我可以在尝试获取锁时进行定时等待,但如果超时到期,我现在就有了竞争条件。
像这样的简单二进制锁有更好的解决方案吗?也许使用 fcntl 和/或独占打开的锁定文件?
python - Django:简单的速率限制
我的许多观点都获取外部资源。我想确保在重负载下我不会炸毁远程站点(和/或被禁止)。
我只有 1 个履带,所以有一个中央锁就可以了。
所以细节:我希望每秒最多允许对主机进行 3 个查询,并且让其余的块最多 15 秒。我怎么能(轻松)做到这一点?
一些想法:
- 使用 django 缓存
- 似乎只有 1 秒的分辨率
- 使用基于文件的信号量
- 容易为并发做锁。不知道如何确保每秒只进行 3 次提取。
- 使用一些共享内存状态
- 我宁愿不安装更多的东西,但如果我必须的话。
c++ - UNIX/OSX 版本的 semitimedop
GLibC 有一种方法semtimedop
允许您执行某个操作(在这种情况下为信号量获取),该操作会在一定时间后超时。Win32 也提供WaitForSingleObject
了类似的功能。
据我所知,在 OSX 或其他 Unices 上没有等价物。您能否建议 semtimedop 的等效项或在一定时间后干净地终止 semop 的解决方法。
c++ - 在 Qt 的子线程中调用函数?
我有一个在不同时间调用子线程函数的主线程,但我不确定在 Qt 中这是否是正确的方法。下面的代码有什么问题并寻找更好的替代方案
当主线程释放锁子时,主线程会无限运行。
linux - 如何显示当前持有信号量的进程?
在用户空间 Linux 中,我有一个进程阻塞在信号量上,如 strace 所发现的。一旦发生错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。
有没有办法知道哪个其他进程当前持有信号量?
ipcs
列出信号量,/proc/sysvipc/sem 也是如此。我在哪里可以找到有关持有过程的信息?