标签: semaphore

Mac OS X上的POSIX信号量:sem_timedwait替代方案

我正在尝试移植一个使用Semaphores到Mac OS X的项目(从linux)但是在Mac OS X上没有实现一些posix信号量

我在这个港口遇到的那个是 sem_timedwait()

我对信号量知之甚少,但是从手册页sem_wait()似乎接近sem_timedwait并且实现了

从手册页

sem_timedwait() function应锁定函数中
semas所引用的信号量sem_wait().但是,如果在
不等待另一个进程或线程
通过执行sem_post() 函数来解锁信号量的情况下无法锁定信号量,则
在指定的超时到期时应终止此等待

从我对semphores如何工作的有限理解,我可以看到sem_timedwait()更安全,但我仍然应该能够使用sem_wait()

它是否正确?如果不是我还有其他选择......

谢谢

unix macos posix semaphore

10
推荐指数
2
解决办法
1万
查看次数

查询PHP信号量而不阻塞?

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

干杯,丹.

php semaphore blocking

10
推荐指数
1
解决办法
1565
查看次数

"信号量的使用是巧妙的错误"

在上个学期,我在C中学习了OS实习,其中第一个项目涉及制作线程包,然后编写多个生产者 - 消费者程序来演示功能.然而,在获得评分反馈之后,我失去了"信号量的使用是巧妙的错误"和"程序假设抢占(例如使用产量来改变控制)"(我们从一个非抢占式线程包开始然后稍后添加抢占).请注意,注释和示例相互矛盾.我相信它也不会假设,并且可以在两种环境中工作).

这已经困扰了我很长一段时间 - 课程工作人员有点不知所措,所以我不能问他们这个学期有什么问题.我花了很长时间思考这个,我看不出问题.如果有人可以看一看并指出错误,或者向我保证实际上没有问题,我真的很感激.

我相信语法在线程包函数(minithreads和semaphores)方面应该是非常标准的,但是让我知道是否有任何令人困惑的事情.

#include <stdio.h>
#include <stdlib.h>
#include "minithread.h"
#include "synch.h"
#define BUFFER_SIZE 16
#define MAXCOUNT 100

int buffer[BUFFER_SIZE];
int size, head, tail;
int count = 1;
int out = 0;
int toadd = 0;
int toremove = 0;

semaphore_t empty;
semaphore_t full;
semaphore_t count_lock; // Semaphore to keep a lock on the 
                        // global variables for maintaining the counts


/* Method to handle the working of a student 
    * The ID of a student is …
Run Code Online (Sandbox Code Playgroud)

c concurrency semaphore producer-consumer

10
推荐指数
1
解决办法
487
查看次数

如何实现分布式信号量?

我有一组有限的资源,我希望在多个进程之间共享,而不是在多个服务器上运行.我想我需要的东西可以称为分布式信号量.

我找到了一个可以调整的旧Perl实现(基于memcached).我还没有完全调查过它.

是否有库/组件/软件已经这样做了?也许算法?故障转移怎么样?

.net distributed semaphore ipc

10
推荐指数
1
解决办法
4775
查看次数

信号量如何以及为什么能够提供比初始化时更多的许可证?

我正在阅读Java Concurrency in Practice一书.在一节java.util.concurrent.Semaphore中,书中有以下几行.它是关于其"虚拟许可"对象的实现的评论

该实现没有实际的许可对象,Semaphore也没有将分配的许可与线程相关联,因此在一个线程中获得的许可可以从另一个线程中释放.您可以将其 acquire视为消费许可和release创建许可; a Semaphore不限于创建它的许可数量.

有人可以解释一下吗?我无法理解这一点.如果我们创建一个固定大小的池,我们会创建固定数量的"许可".从上面的陈述看,"许可证"似乎可以继续增长.为什么这样设计?

java concurrency multithreading semaphore

10
推荐指数
3
解决办法
9532
查看次数

如何限制同一个Ruby脚本的并发实例?

在Ruby 1.9.x中,可能是一种简单的方法,不允许我的Ruby脚本再次运行,或者等待前一个实例完成?**

我希望避免凌乱的文件锁定或进程表检查.

核心中是否存在类似全局互斥或信号量的东西?我研究了本机Mutex,但这似乎只适用于一个Ruby进程中的线程,而不是跨越不同的进程.

**稍后我可能会添加超时功能,或限制N个实例,或者看起来使用多个全局锁(每个系统范围的资源一个,应该只有一个实例).

ruby mutex semaphore locking multiple-instances

10
推荐指数
2
解决办法
2724
查看次数

由于虚假的唤醒,Semaphore.acquire()会抛出InterruptedException吗?

一个看似简单的问题:我有一个java.util.concurrent.Semaphore,我希望获得许可证使用acquire().

如果线程被中断,acquire()则指定该方法抛出InterruptedException:

如果当前线程:

  • 在进入此方法时设置其中断状态; 要么
  • 在等待许可证时被打断,

然后抛出InterruptedException并清除当前线程的中断状态.

但是,使用可能抛出的方法的通常模式InterruptedException是在循环中调用它们,因为线程可能受到虚假唤醒的影响,这些唤醒看起来与被中断相同.例如,文档Object.wait(long)说:

线程也可以在没有被通知,中断或超时的情况下唤醒,即所谓的虚假唤醒.虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防范它,并且如果条件不满足则继续等待.换句话说,等待应始终在循环中进行.

所以问题是,是否Semaphore.acquire()受到同样的虚假唤醒?合乎逻辑的答案是"不",但我找不到任何证据,实际上证据似乎指向了另一个方向.

查看源代码Semaphore,它似乎将实际的获取委托给a AbstractQueuedSynchronizer,根据其来源代表LockSupport.park().

明确提到虚假唤醒的文档LockSupport.park(),但实现AbstractQueuedSynchronizer.doAcquireInterruptably()似乎只是检查Thread.interrupted()然后抛出InterruptedException.

所以,除非我遗漏了某些东西(这是非常可能的),否则看起来可能Semaphore.acquire() 抛出InterruptedException虚假的东西?

那是对的吗?更重要的是,我能做些什么吗?我可以使用Semaphore.acquireUninterruptably(),但我不想要一个不间断的等待,只是一个不会被虚假中断的.还有其他选择吗?

java semaphore java.util.concurrent

10
推荐指数
1
解决办法
2717
查看次数

名称和未命名的信号量

我试图了解命名和未命名信号量之间的相似点和不同点,所以我的谷歌搜索让我得到了这个.我对页面上的措辞有疑问,但它说:

  • 未命名的信号量可能被多个进程使用
  • 命名信号量可以通过多个进程共享

这两个词是否会在这两种信号量之间产生任何重要的区别,还是无关紧要?

到目前为止,这就是我所拥有的:

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value
Run Code Online (Sandbox Code Playgroud)

这就是我从那个定义中可以收集的全部内容.是这一切,他们是正确的吗?或者我错过了一些重要的概念?

posix semaphore

10
推荐指数
2
解决办法
1万
查看次数

如何在C中初始化二进制信号量

手册页中,即使您将信号量初始化为值1,也会显示:

sem_init(&mySem, 0, 1);
Run Code Online (Sandbox Code Playgroud)

多次调用时,它仍然可以增加到大于1的值

sem_post(&mySem);
Run Code Online (Sandbox Code Playgroud)

但在这个代码示例中,注释似乎有不同的看法:

sem_init(&mutex, 0, 1);      /* initialize mutex to 1 - binary semaphore */
Run Code Online (Sandbox Code Playgroud)

是否可以在C中初始化严格的二进制信号量?

注意:在这种情况下执行此操作而不是使用互斥锁的原因是sem_post和sem_wait可能由不同的线程调用.

c linux semaphore init

9
推荐指数
1
解决办法
2万
查看次数

Go中的惯用可变大小工作池

我正试图在Go中实现一个工作池.在去维基(和有效的围棋频道部分)功能限制资源利用的很好的例子.只需创建一个具有与工作池一样大的缓冲区的通道.然后用工人填充该频道,并在完成后将其发送回频道.从通道块接收,直到工作人员可用.所以频道和循环是整个实现 - 非常酷!

或者,可以阻止发送到频道,但同样的想法.

我的问题是在工作池运行时改变它的大小.我不相信有办法改变频道的大小.我有一些想法,但大多数看起来都太复杂了. 这个页面实际上使用一个通道和空结构以大致相同的方式实现了一个信号量,但它有同样的问题(这些东西一直在谷歌搜索"golang信号量".

concurrency semaphore worker-process go goroutine

9
推荐指数
1
解决办法
6598
查看次数