我正在尝试移植一个使用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()
它是否正确?如果不是我还有其他选择......
谢谢
是否可以查询使用sem_get创建的信号量而不像sem_acquire函数那样实际阻塞?
干杯,丹.
在上个学期,我在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) 我有一组有限的资源,我希望在多个进程之间共享,而不是在多个服务器上运行.我想我需要的东西可以称为分布式信号量.
我找到了一个可以调整的旧Perl实现(基于memcached).我还没有完全调查过它.
是否有库/组件/软件已经这样做了?也许算法?故障转移怎么样?
我正在阅读Java Concurrency in Practice一书.在一节java.util.concurrent.Semaphore中,书中有以下几行.它是关于其"虚拟许可"对象的实现的评论
该实现没有实际的许可对象,
Semaphore也没有将分配的许可与线程相关联,因此在一个线程中获得的许可可以从另一个线程中释放.您可以将其acquire视为消费许可和release创建许可; aSemaphore不限于创建它的许可数量.
有人可以解释一下吗?我无法理解这一点.如果我们创建一个固定大小的池,我们会创建固定数量的"许可".从上面的陈述看,"许可证"似乎可以继续增长.为什么这样设计?
一个看似简单的问题:我有一个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(),但我不想要一个不间断的等待,只是一个不会被虚假中断的.还有其他选择吗?
我试图了解命名和未命名信号量之间的相似点和不同点,所以我的谷歌搜索让我得到了这个.我对页面上的措辞有疑问,但它说:
这两个词是否会在这两种信号量之间产生任何重要的区别,还是无关紧要?
到目前为止,这就是我所拥有的:
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)
这就是我从那个定义中可以收集的全部内容.是这一切,他们是正确的吗?或者我错过了一些重要的概念?
在手册页中,即使您将信号量初始化为值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可能由不同的线程调用.