semaphore 相关问题

信号量是一种同步原语,用于跟踪有限数量的资源中有多少可用。

根据主循环设置的变量值立即中断辅助线程循环

我在 C++ 中遇到并发问题,我正在努力寻找最佳解决方案。我有两个线程:一个是主程序,另一个负责控制灯...

回答 1 投票 0

POSIX 标准和信号量语义

我正在尝试理解信号量的语义。 这是一些代码: #包括 #包括 #包括 #包括 #包括 我正在尝试理解信号量的语义。 这是一些代码: #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> sem_t sem; void *helper(void *arg) { sem_wait(&sem); printf("helper woke up\n"); } int main() { sem_init(&sem, 0, 0); pthread_t tid; pthread_create(&tid, NULL, helper, NULL); sleep(1); sem_post(&sem); sem_wait(&sem); printf("main woke up\n"); exit(0); } 这里 main 创建一个辅助线程,休眠一秒钟以(几乎)确定辅助线程已运行并等待信号量,然后尝试快速连续地发布并等待信号量。根据 POSIX (https://pubs.opengroup.org/onlinepubs/009695399/functions/sem_post.html): 如果此操作产生的信号量值为零,则应允许阻塞等待信号量的线程之一从其对 sem_wait() 的调用中成功返回。 所以,我希望打印“助手醒来”。但是,如果您实际上在 Linux 上运行此代码,通常会观察到“main 唤醒”,这意味着默认情况下 Linux 上的信号量是允许不公平的。 我的问题是:为什么允许这种行为?是的,你可以说“它更容易实现”,但这并不能解释为什么信号量是用这些特定的语义设计的。 在其他地方,(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html)它表示这种行为在某些情况下更可取。在什么情况下非公平信号量更好?我将不胜感激有关此主题的任何详细资料。 这样做的一个更好的方法是它减少了上下文切换。允许调用 sem_post() 的线程继续运行,而不必恢复在 sem_wait() 中阻塞的线程。 当调度程序决定解除哪个线程的阻塞时,主线程已调用 sem_wait()。然后它选择要解除封锁的服务员。然后,它可以根据调度优先级(如引用段落的其余部分所述)或任意选择。并且它可能会选择主线程以避免上下文切换。

回答 1 投票 0

如果信号量上有服务员,为什么线程可以向自身发送消息?

这是我为理解信号量语义而编写的一些代码: #包括 #包括 #包括 #包括 #包括 这是我为理解信号量语义而编写的一些代码: #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> sem_t sem; void *helper(void *arg) { sem_wait(&sem); printf("helper woke up\n"); } int main() { sem_init(&sem, 0, 0); pthread_t tid; pthread_create(&tid, NULL, helper, NULL); sleep(1); sem_post(&sem); sem_wait(&sem); printf("main woke up\n"); exit(0); } 为什么打印这个 main woke up 而不是这个? helper woke up 如果我们查看手册页,就会发现 如果信号量的值因此变得大于零,那么 在 sem_wait(3) 调用中阻塞的其他进程或线程将被唤醒并继续锁定信号量。 那么为什么允许主线程而不是辅助线程继续进行呢? 我在 Linux 上尝试了这段代码,得到了和你一样的结果。 但是当我使用gdb一步步调试这段代码时,我发现终端上打印了helper woke up,然后主线程将永远等待。 所以我认为这可能是一个未定义的行为,因为主线程永远不会进入 printf 函数,并且 main 函数永远不会退出。所以可能会涉及到一些奇怪的系统机制。 你可以删除主函数中最后一个sem_wait(&sem);,就会得到这样的结果。 helper woke up main woke up

回答 1 投票 0

命名信号量不会像进程之间的同步中假设的那样工作

给定写入器和读取器代码如下,该程序将无法按预期工作: 预期行为:在我们启动 writer 后,通常在 2 秒后,我们从另一个术语启动 reader...

回答 1 投票 0

Javascript 信号量/测试和设置/锁定?

Javascript 中有原子测试和设置、信号量或锁之类的东西吗? 我有 javascript 通过自定义协议调用异步后台进程(后台进程实际上运行......

回答 8 投票 0

为什么信号量为空== 0但不阻塞?

C 中的经典生产者-消费者问题。 #包括 #包括 #包括 int 缓冲区 = 0; sem_t *互斥锁,*满,*空; 无效*生产者(无效*参数){ ...

回答 1 投票 0

信号量动态调整大小C#

我正在尝试使用信号量来控制可以同时运行的作业实例数。虽然使用等待方法相当简单,但我也希望该值可以在运行时配置,所以

回答 3 投票 0

没有办法限制节点并发数吗?

我一直在寻找一种方法来做到这一点: 代替: 等待 myfunc() 我想要: 限制器 = 限制器(50) 等待限制器(myfunc) 限制器不会将我的函数添加到事件队列中,而是会...

回答 1 投票 0

应该使用哪一个? “_counter += 1”或“Interlocked.Increment(ref _counter)”

多线程的时候应该使用哪一个呢? _计数器 += 1 或者 互锁.增量(ref _counter) 。 公开课演示 { 公共无效主要() { 对于 (int i = 0; i < 5; i++) ...

回答 1 投票 0

UE5 FSemaphore结构是否起到进程间同步的作用?

他们的文档上的结构描述是“进程间信号量的通用表示”,但我在网上读过其他内容,但另有说明。 他们的文档...

回答 1 投票 0

C 线程中的睡眠理发师问题

我正在尝试使用C语言和线程来解决理发师睡觉的问题。我写了一个主函数,以及线程控制的理发师和顾客函数。 由于某种原因,我的程序无法...

回答 1 投票 0

使方法不可重入的技术

我有一个 ASP.NET Core 应用程序,其异步方法具有类似这样的签名。 公共异步任务 RunAsync() { // ... } 我担心这个方法同时运行......

回答 1 投票 0

C 信号量和共享内存

我正在尝试分别使用一个生产者和一个消费者来开发经典的生产者-消费者循环缓冲区示例。 然而我遇到了一些问题,我不知道它们来自哪里......

回答 1 投票 0

使用 Goroutines 在后台注释和获取数据 – Route Handler 中信号量获取错误

我正在 Go Web 应用程序中实现文件注释过程。该过程包括读取文件、将 ID 存储在数组中、对 ID 进行分块,然后使用...

回答 1 投票 0

如何通过数据库实现信号量?

我有一个每晚需要运行的进程 - 每晚运行一次。它是一个后台服务,作为我的 Blazor 应用程序的一部分运行。我可以运行该应用程序的多个实例(横向扩展)。 基本上我...

回答 1 投票 0

如果我们在二进制信号量中没有使用 semTake 的情况下多次调用 semGive 会怎么样?会有什么行为?

我们已经使用 semBcreate 创建了一个二进制信号量。 代码片段: semTake(等待 10 秒); // 重启时只会调用一次 semGive(); //这将从多个

回答 1 投票 0

如何使用信号量实现条件变量?

不久前,我正在考虑如何相互实现各种同步原语。例如,在 pthread 中,您可以获得互斥体和条件变量,并且从中可以...

回答 2 投票 0

在 Mac OS X 中清理信号量

我有一个程序,其中一些信号量未清理,因此如果我运行它几次,程序就会出现分段错误。我曾经在linux中使用以下命令来清理它们。 ipcs -s |...

回答 3 投票 0

修改Peterson算法

我知道 Peterson Algo 的默认实现。为我提供了——互斥、进步和有限等待。 正常的彼得森算法如下。 布尔标志[0] = false; 布尔标志[1] = ...

回答 2 投票 0

使用“lock”相对于“SemaphoreSlim”有什么优势?

我迟到了,但我最近了解了 SemaphoreSlim: 我曾经使用 lock 进行同步锁定,并使用 busy 布尔值进行异步锁定。现在我只使用 SemaphoreSlim 来处理所有事情......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.