当前位置: 首页 > 知识库问答 >
问题:

二进制信号量的java结构

赫连方伟
2023-03-14

我有:

要点:

  • 生成项目比更新GUI快得多
  • 我们可能有很多新项目同时生产
  • 每个项目生产后都必须进行一次GUI更新
  • 如果产品同时发生,所有产品必须只进行一次更新...没有必要多次刷新GUI

我想我正在寻找一些实现二进制信号量的标准结构,其中最大许可数是1,这样工作人员就可以调用多个release(),而不会相互阻塞,如果调用了一个release(),那么:

  • 如果GUI线程正在睡眠=

代码应如下所示:

[Workers]
.. produce item ..
sem.release()

[GUI Thread]
while(true) {
  sem.acquire()
  .. update gui ..
}

请注意,使用1个可用许可证初始化的信号量不是此场景的解决方案,因为许多同时完成任务的工作人员应该只释放一个许可证;否则GUI线程将运行太多次

共有1个答案

臧欣怿
2023-03-14

使用信号灯?

对于生产的每个项目,生产商将信号量“上调”1。

消费者尽可能地“降低”信号量;类似这样的东西:

sema.acquire();  
n = 1;
while (sema.tryAcquire(very short timeout))
    ++n;
// there are now known to be n items available
   

也许在GUI“路由”末尾的try Acquire上也有相同的循环,不管是什么。

这有点疯狂。您对一次更新的要求有多严格?你能忍受偶尔得到不止一个吗?

如果必须只进行一次更新,则需要有一个双向互锁(即经典的生产者-消费者)。不管你没有它做什么,你都不能在你决定把它们都拿到手后几纳秒就阻止一个制作人再生产“一个”。为了弥补这个漏洞,需要告诉制作人在GUI更新时暂停。

 类似资料:
  • 问题内容: 我一直在尝试了解可重入锁和信号量(可重入锁的嵌套与释放/解锁机制)。 似乎拥有信号量需要您编写一个经过更彻底测试的应用程序,因为release()方法不会检查释放许可的线程是否实际上持有它。测试我的测试代码时,我发现这可能会随后使许可数量超出初始限制。另一方面,如果线程在调用unlock方法时未持有可重入锁,则将收到IllegalMonitorException。 因此,可以说没有真正

  • 在计算信号量时,没有提供相互排斥,因为有一组同时需要在临界区执行的进程。 然而,二进制信号严格提供互斥。 在这里,临界区域不能有超过1个槽位,而临界区域最多只能有1个槽位。 信号量只能有两个值,0或1。 下面,我们来看看二进制信号量的编程实现。

  • 我有多个进程与Sempahore同步。我知道这段代码不允许gurantee出现这样的情况:在sem_getvalue期间,即使值变为零,甚至在调用特定进程中的sem_post之前,anotehr进程也可能调用sem_post,使值变为2。如何解决这种情况。 我的问题不能通过互斥体来解决,在我的问题中,有些进程只用于信号,即操作,而在互斥体中,所有进程都将等待并不断地发出信号

  • 问题内容: 在手册页中,即使您将信号量初始化为一个值,也可能会出现: 多次调用时,它仍可以增加到大于1的值。 但是在此代码示例中,注释似乎有所不同: 是否可以在C中初始化严格的二进制信号量? 注意:在这种情况下,这样做而不使用互斥的原因是sem_post和sem_wait可能由不同的线程调用。 问题答案: 如果要在Linux上使用严格的二进制信号量,建议使用互斥量和条件变量构建一个。

  •  提示: 任务通知在某些情况下可以提供一个轻量的选择用以替代二值信号量,详见:任务通知  二值信号量(Binary Semaphores)通常用来实现互斥、同步。二值信号量与互斥量虽然相似,但是互斥量拥有优先级继承的特性,而二值信号量没有。这使得二值信号量更加合适去实现同步,互斥量更加适合去实现互斥。 信号量可以设置阻塞时间,当任务试图获取一个暂时不可用的信号量的适时候,会进入阻塞态,直到阻塞时间