问题标签 [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 投票
4 回答
12844 浏览

multithreading - 多线程 BASH 编程 - 通用方法?

好的,我在所有演示中都运行POV-Ray,但 POV 仍然是单线程的,不会使用多个内核。因此,我开始考虑 BASH 中的解决方案。

我编写了一个通用函数,它接受命令列表并在指定数量的子 shell 中运行它们。这实际上可行,但我不喜欢它以线程安全 的多进程方式处理访问下一个命令的方式:

  • 它需要一个带有命令的文件(每行 1 个)作为参数,
  • 要获得“下一个”命令,每个进程(“线程”)将:
    • 等到它可以创建一个锁定文件,使用:ln $CMDFILE $LOCKFILE
    • 从文件中读取命令,
    • 通过删除第一行修改 $CMDFILE,
    • 删除 $LOCKFILE。

有没有更清洁的方法来做到这一点? 我无法让子外壳正确地从 FIFO 中读取一行。


顺便说一句,这样做的目的是增强我在 BASH 命令行上的功能,而不是寻找非 bash 解决方案。我倾向于从命令行执行很多复杂的任务,并且想要工具箱中的另一个工具。

同时,这是处理从文件中获取下一行的函数。如您所见,它每次读取/删除一行时都会修改一个磁盘文件。这看起来有点骇人听闻,但我没有想出更好的方法,因为 FIFO在 bash 中没有setvbuf()不起作用。

0 投票
2 回答
1670 浏览

.net - .NET 紧凑框架中的信号量

不幸的是,使用 .NET Compact Framework 时 System.Threading 中没有信号量。我不确定为什么会这样,有人有想法吗?

谷歌搜索后,我发现很多人给出了他们自己的实现,但没有一个人真的很好用......或者根本没有!

所以特地来请教专家...

有没有人可以为 .NET 紧凑型框架推荐一个好的信号量类/库?

或者

有什么办法可以模仿这种行为吗?

我有一个典型的生产者/消费者设置,其中线程将对象推送到队列(System.Collections)。然后我希望消费者线程将对象从队列中拉出并开始工作,但显然只有当队列中有东西可以使用时!

我正在使用 C#,但只要我可以在 .NET CF 上实现它,我就会采用任何语言的解决方案/伪代码。

0 投票
2 回答
2889 浏览

c++ - Linux 进程间可重入信号量

我正在将一个 Windows 应用程序移植到 Linux,但我遇到了同步问题。

在 Windows 中,我使用名为 mutex 的系统级来同步对共享内存块的访问。

我如何在 Linux 中模拟它?我使用 semget 创建了一个 SystemV 信号量。问题是它不是可重入的,如果我已经持有它,它会阻塞,这与 Windows 不同。我可以向它添加一个引用计数,但是我需要同步对它的访问,这意味着另一个(这次仅针对当前进程)互斥体。

是否有某个类提供可重入进程间锁(可能在 Boost 中)?

顺便说一句,使用文件锁是不可接受的,因为它可能太慢了(我需要两个进程之间的超低延迟通信)。

0 投票
3 回答
1756 浏览

c++ - fcntl() 用于线程或进程同步?

是否可以在文件上使用 fcntl() 系统调用来实现线程/进程同步(而不是信号量)?

0 投票
2 回答
3616 浏览

c - RedHat Enterprise Linux 5.3 及更高版本不支持 sem_timedwait?

我们在使用 pthreads sem_timedwait 的 RedHat Enterprise Linux 系统上看到了奇怪的行为。它只发生在 5.3 以后的版本中。

当我们使用 sem_init 在后台线程上创建信号量时,不会返回错误。当我们执行 sem_timedwait 时,我们会立即返回 errno = 38 (ENOSYS),表明它不受支持。

如果我们在主线程上做同样的事情,它会按预期工作,并且我们不会从 sem_timedwait 得到错误。

我们在 RHEL 5.2 或更早版本上看不到它。我们尝试使用 gcc 3.2.3 和 4.1.2 编译我们的代码并得到相同的结果,所以这似乎是一个运行时问题。

所以,我的问题(最后;)

1)有没有其他人看到这个?2) 从 RHEL 5.3 开始,这是一个已知问题吗?3) 我们使用 sem_timedwait 来休眠一个线程。Linux 上有哪些替代方案可以做同样的事情?

如果这是另一个问题的重复,请告诉我。我看过但找不到有相同问题的问题,只是 OSX 的类似问题,这不是我们正在使用的。

谢谢,pxb

更新:刚刚做了一些更多的测试,结果如下:

  • 如果我在 RHEL5.4 机器上使用 gcc 4.1.2 进行 64 位构建(使用 -L/usr/lib64 和 -lstdc++ -lrt)并在 RHEL5 的 64 位安装上运行它,它工作正常
  • 如果我在 RHEL5.1 机器上使用 gcc 4.1.2 进行 32 位构建(使用 -L/usr/lib 和 -lstdc++ -lrt)并在完全相同的 64 位 RHEL5 机器上运行它,我们会从sem_timedwait

因此,这似乎是 RHEL5.4(和看似 RHEL5.3)上的 64 位和 32 位运行时库之间的差异。唯一的其他区别是 32 位和 64 位版本分别由 RHEL5.1 和 RHEL5.4 机器完成。

0 投票
2 回答
527 浏览

compact-framework - Xbox 360 上的 XNA 有没有好的信号量?

我正在为 .NET Compact Framework 寻找快速高效的信号量实现。这里有另一个关于 SO(.NET 紧凑框架中的信号量)的问题,其中建议使用 P/Invoke,但这在 XBox 360 上运行的 XNA 框架中是不可能的。

我可以提供两种我自己的实现,但我相信两者都不是最佳的。

使用 AutoResetEvent (pastebin)
的信号量 托管信号量的一种可能实现是使用 AutoResetEvent。

在这种情况下,当工作可用时,AutoResetEvent 将仅将一个线程转换为“可运行”状态。当 OS 线程调度程序运行线程时,它将重新打开 AutoResetEvent,使下一个线程进入“可运行”状态。所以线程将按顺序启动,并且只有在它们的前任真正开始执行之后。

使用 ManualResetEvent (pastebin)
另一种可能的实现是使用 ManualResetEvent。

在这种情况下,当工作可用时,ManualResetEvent 会将所有线程转换为“可运行”状态。OS 线程调度程序运行的所有线程都在竞争工作项,直到第一个耗尽工作的线程再次重置 ManualResetEvent。换句话说,即使不是所有线程都需要,也可能所有线程都会在短时间内被唤醒。

有谁知道那里有更好的实施方案,或者可以提供改进我的建议?

0 投票
9 回答
4364 浏览

c++ - 线程和简单的死锁治疗

在使用互斥锁和信号量处理线程(特别是在 C++ 中)时,是否有一个简单的经验法则可以避免死锁并进行干净的同步?

0 投票
2 回答
578 浏览

java - java信号量南北阙

在操场上,有两排孩子在等待使用环形交叉路口——一个从北面向它,一个从南面向它。儿童只能从任一队列的前面进入环形交叉路口,并且只有在有可用空间的情况下才能进入(每次只能有一个孩子使用每个路段)。一旦进入环形交叉路口,他们会随机使用一段时间,然后随机向东或向西离开。然后他们在别处玩一段随机时间,然后随机重新进入南北队列,以此类推,无限循环。环形交叉路口顺时针旋转,排队的孩子将始终使用第一个出现的空间...... 使用 java 信号量编写一个程序,以通过一组代表孩子的进程同步对共享环形交叉路口对象的访问。

这是我到目前为止所做的,不知道下一步该做什么。我在主课上做什么?

我到了这里,现在我迷路了!请协助

0 投票
2 回答
1682 浏览

php - 在不阻塞的情况下查询 PHP 信号量?

是否可以在不像 sem_acquire 函数那样实际阻塞的情况下查询使用 sem_get 创建的信号量?

干杯,丹。

0 投票
2 回答
329 浏览

concurrency - 信号量“完整”吗?

可以通过明智地使用信号量来解决所有可以想象的同步问题吗?那么弱信号量呢?