问题标签 [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.
multithreading - 多线程 BASH 编程 - 通用方法?
好的,我在所有演示中都运行POV-Ray,但 POV 仍然是单线程的,不会使用多个内核。因此,我开始考虑 BASH 中的解决方案。
我编写了一个通用函数,它接受命令列表并在指定数量的子 shell 中运行它们。这实际上可行,但我不喜欢它以线程安全 的多进程方式处理访问下一个命令的方式:
- 它需要一个带有命令的文件(每行 1 个)作为参数,
- 要获得“下一个”命令,每个进程(“线程”)将:
- 等到它可以创建一个锁定文件,使用:ln $CMDFILE $LOCKFILE
- 从文件中读取命令,
- 通过删除第一行修改 $CMDFILE,
- 删除 $LOCKFILE。
有没有更清洁的方法来做到这一点? 我无法让子外壳正确地从 FIFO 中读取一行。
顺便说一句,这样做的目的是增强我在 BASH 命令行上的功能,而不是寻找非 bash 解决方案。我倾向于从命令行执行很多复杂的任务,并且想要工具箱中的另一个工具。
同时,这是处理从文件中获取下一行的函数。如您所见,它每次读取/删除一行时都会修改一个磁盘文件。这看起来有点骇人听闻,但我没有想出更好的方法,因为 FIFO在 bash 中没有setvbuf()不起作用。
.net - .NET 紧凑框架中的信号量
不幸的是,使用 .NET Compact Framework 时 System.Threading 中没有信号量。我不确定为什么会这样,有人有想法吗?
谷歌搜索后,我发现很多人给出了他们自己的实现,但没有一个人真的很好用......或者根本没有!
所以特地来请教专家...
有没有人可以为 .NET 紧凑型框架推荐一个好的信号量类/库?
或者
有什么办法可以模仿这种行为吗?
我有一个典型的生产者/消费者设置,其中线程将对象推送到队列(System.Collections)。然后我希望消费者线程将对象从队列中拉出并开始工作,但显然只有当队列中有东西可以使用时!
我正在使用 C#,但只要我可以在 .NET CF 上实现它,我就会采用任何语言的解决方案/伪代码。
c++ - Linux 进程间可重入信号量
我正在将一个 Windows 应用程序移植到 Linux,但我遇到了同步问题。
在 Windows 中,我使用名为 mutex 的系统级来同步对共享内存块的访问。
我如何在 Linux 中模拟它?我使用 semget 创建了一个 SystemV 信号量。问题是它不是可重入的,如果我已经持有它,它会阻塞,这与 Windows 不同。我可以向它添加一个引用计数,但是我需要同步对它的访问,这意味着另一个(这次仅针对当前进程)互斥体。
是否有某个类提供可重入进程间锁(可能在 Boost 中)?
顺便说一句,使用文件锁是不可接受的,因为它可能太慢了(我需要两个进程之间的超低延迟通信)。
c++ - fcntl() 用于线程或进程同步?
是否可以在文件上使用 fcntl() 系统调用来实现线程/进程同步(而不是信号量)?
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 机器完成。
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。换句话说,即使不是所有线程都需要,也可能所有线程都会在短时间内被唤醒。
有谁知道那里有更好的实施方案,或者可以提供改进我的建议?
c++ - 线程和简单的死锁治疗
在使用互斥锁和信号量处理线程(特别是在 C++ 中)时,是否有一个简单的经验法则可以避免死锁并进行干净的同步?
java - java信号量南北阙
在操场上,有两排孩子在等待使用环形交叉路口——一个从北面向它,一个从南面向它。儿童只能从任一队列的前面进入环形交叉路口,并且只有在有可用空间的情况下才能进入(每次只能有一个孩子使用每个路段)。一旦进入环形交叉路口,他们会随机使用一段时间,然后随机向东或向西离开。然后他们在别处玩一段随机时间,然后随机重新进入南北队列,以此类推,无限循环。环形交叉路口顺时针旋转,排队的孩子将始终使用第一个出现的空间...... 使用 java 信号量编写一个程序,以通过一组代表孩子的进程同步对共享环形交叉路口对象的访问。
这是我到目前为止所做的,不知道下一步该做什么。我在主课上做什么?
我到了这里,现在我迷路了!请协助
php - 在不阻塞的情况下查询 PHP 信号量?
是否可以在不像 sem_acquire 函数那样实际阻塞的情况下查询使用 sem_get 创建的信号量?
干杯,丹。
concurrency - 信号量“完整”吗?
可以通过明智地使用信号量来解决所有可以想象的同步问题吗?那么弱信号量呢?