问题标签 [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.

0 投票
1 回答
1199 浏览

java - 单个java信号量死锁?

在我最近的一个答案中,我给出了一个限制访问内存资源的理论信号量示例:

如果分配交错不好,我认为这可能是死锁的根源:

我的观察是真的吗?如果是,我怎样才能避免这种情况(例如定时等待和回滚)?

0 投票
6 回答
38376 浏览

java - 信号量是如何工作的?

信号量可以小于0吗?我的意思是,假设我有一个 N=3 的信号量,我调用了 4 次“down”,那么 N 将保持为 0,但一个进程会被阻塞?

反之亦然,如果一开始我叫,N能大于3吗?因为正如我所看到的,如果 N 可以高于 3,如果一开始我调用了几次,那么稍后我可以调用比我可以调用的次数更多,从而将更多的进程放在关键部分,然后信号量允许我.

如果有人能为我澄清一下,我将不胜感激。

格雷格

0 投票
1 回答
758 浏览

semaphore - 如何知道哪些进程打开/使用特定的信号量?

我们有一个由 281 个进程打开的信号量,有没有办法获取这些进程的所有 pid?

ipcs -a|grep 67108878

s 67108878 0xcef73014 --ra-ra---- oracle dba oracle dba 281 17:54:58 9:27:30

0 投票
2 回答
1696 浏览

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() 后的新信号量。

所以我没有办法释放他们......

0 投票
4 回答
16511 浏览

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参数?

0 投票
1 回答
2954 浏览

linux - 多进程同步 - 比信号量更好的选择?

我有一个在多个生产者和多个消费者之间共享的队列资源。都是独立的进程;没有一个进程“拥有”队列。

根据实现的性质,必须控制对队列的访问,并且在任何给定时刻只能允许一个进程推送或弹出。

我认为使用名为 semaphore 的 POSIX 将是正确的解决方案,但是其中一些细节困扰着我。(顺便说一句,这是一个仅限 Linux 的实现。)

  1. 什么时候(如果有的话)我应该做一个 sem_unlink?是否有任何理由实际删除队列?

  2. 我担心在锁定队列信号量时进程会死机。有什么好办法解决这个问题吗?我可以在尝试获取锁时进行定时等待,但如果超时到期,我现在就有了竞争条件。

  3. 像这样的简单二进制锁有更好的解决方案吗?也许使用 fcntl 和/或独占打开的锁定文件?

0 投票
2 回答
1734 浏览

python - Django:简单的速率限制

我的许多观点都获取外部资源。我想确保在重负载下我不会炸毁远程站点(和/或被禁止)。

我只有 1 个履带,所以有一个中央锁就可以了。

所以细节:我希望每秒最多允许对主机进行 3 个查询,并且让其余的块最多 15 秒。我怎么能(轻松)做到这一点?

一些想法:

  • 使用 django 缓存
    • 似乎只有 1 秒的分辨率
  • 使用基于文件的信号量
    • 容易为并发做锁。不知道如何确保每秒只进行 3 次提取。
  • 使用一些共享内存状态
    • 我宁愿不安装更多的东西,但如果我必须的话。
0 投票
1 回答
1979 浏览

c++ - UNIX/OSX 版本的 semitimedop

GLibC 有一种方法semtimedop允许您执行某个操作(在这种情况下为信号量获取),该操作会在一定时间后超时。Win32 也提供WaitForSingleObject了类似的功能。

据我所知,在 OSX 或其他 Unices 上没有等价物。您能否建议 semtimedop 的等效项或在一定时间后干净地终止 semop 的解决方法。

0 投票
3 回答
5030 浏览

c++ - 在 Qt 的子线程中调用函数?

我有一个在不同时间调用子线程函数的主线程,但我不确定在 Qt 中这是否是正确的方法。下面的代码有什么问题并寻找更好的替代方案

当主线程释放锁子时,主线程会无限运行。

0 投票
5 回答
21940 浏览

linux - 如何显示当前持有信号量的进程?

在用户空间 Linux 中,我有一个进程阻塞在信号量上,如 strace 所发现的。一旦发生错误情况,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。

有没有办法知道哪个其他进程当前持有信号量?

ipcs列出信号量,/proc/sysvipc/sem 也是如此。我在哪里可以找到有关持有过程的信息?