semaphore 相关问题

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

有时我的二进制信号量没有等待正确的时间

有时等待的时间不够长。我可能错过了一些简单的东西 - 但我找不到它。为什么等待函数有时会过早返回 #定义SEMAPHORE_MAXWAIT -1 #定义

回答 1 投票 0

有时我的二进制信号量无法等待正确的时间

有时等待的时间不够长。我可能错过了一些简单的东西 - 但我找不到它。为什么等待函数有时会过早返回 #定义SEMAPHORE_MAXWAIT -1 #定义

回答 1 投票 0

在异步任务中并行使用WebView2

我有简单的默认Windows桌面表单Form1和一键btn_Go作为测试。 我想运行多个并行的 WebView2 实例并处理渲染页面中的 html 代码。 要在页面中运行 WebView2...

回答 2 投票 0

如果等待时间为0,是否定义了sem_timedwait

如果等待时间为0,是否定义了sem_timedwait,或者在这种情况下我应该调用sem_trywait吗?文档不清楚,源代码仅显示实现。

回答 1 投票 0

带有背压的ExecutorService

我对 ExecutorService 有以下要求: 并发处理任务(线程)数量有限,最好是可配置的 当所有线程都被占用后,后续提交任务...

回答 2 投票 0

在 C 中使用信号量处理套接字

我有以下代码: SOCKET sock = open_socket(szListenHost, iListenPort); 如果(袜子> 0){ 套接字客户端; 结构 sockaddr_in 对等地址; T_socklen len = sizeof(结构

回答 2 投票 0

为什么我用Integer计算会出现死锁?

我正在尝试解决跨独木桥的问题。这是问题的描述: 有一座独木桥。只有一个人可以跨越 桥没有任何停留。

回答 1 投票 0

如何在C中初始化信号量?

我正在尝试初始化 3 个信号量,但是当我尝试这样做时,我在最后一行函数中打印的值是 0 0 0。有人可以告诉我为什么吗? (可以肯定的是,我删除了所有信号量......

回答 1 投票 0

如何在Swift并发中实现异步队列?

背景:我熟悉使用锁和信号量的并发,并且正在学习 Swift 的新并发功能。 这是 Swift 中使用

回答 1 投票 0

信号量未使用 sem_open 正确初始化

我正在尝试用信号量来实现生产者和消费者问题。我认为我的逻辑是正确的,但我的代码没有按预期工作。 #包括 #包括 我正在尝试用信号量来实现生产者和消费者问题。我认为我的逻辑是正确的,但我的代码没有按预期工作。 #include <stdio.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #define BUFFER_SIZE 10 int arr[BUFFER_SIZE]; int position; sem_t *mutex, *empty, *filled; void* producer(void* args){ printf("Prod starting\n"); int a,b; sem_getvalue(empty, &a); sem_getvalue(mutex, &b); printf("empty : %d mutex : %d\n", a, b); do{ sem_wait(empty); sem_wait(mutex); int new = rand()%2000; printf("Adding %d to buffer\n", new); arr[position] = new; position++; sem_post(mutex); sem_post(filled); }while(1); } void* consumer(void* arg){printf("Consumer starting\n"); do{ sem_wait(filled); sem_wait(mutex); position--; printf("Consuming %d from buffer", arr[position]); arr[position] = 0; sem_post(mutex); sem_post(empty); }while(1); } int main() { mutex = sem_open("mutex", O_CREAT, 0644, 1); empty = sem_open("empty", O_CREAT, 0644, BUFFER_SIZE); filled = sem_open("filled", O_CREAT, 0644, 0); pthread_t prod, cons; int a, b,c; sem_getvalue(empty, &a); sem_getvalue(filled, &b); sem_getvalue(mutex, &c); printf("empty:%d filled:%d mutex:%d\n", a,b,c); //printf("Producer = %ld Consumer = %ld\n", prod, cons); pthread_create(&prod,NULL,producer,NULL); pthread_create(&cons,NULL,consumer,NULL); pthread_join(prod,NULL); pthread_join(cons,NULL); sem_close(mutex); sem_unlink("mutex"); sem_close(empty); sem_unlink("empty"); sem_close(filled); sem_unlink("filled"); return 0; } 信号量未正确初始化,从以下输出可知: empty:0 filled:0 mutex:0 Prod starting empty : 0 mutex : 0 Consumer starting 我不明白为什么信号量没有正确初始化。从手册页: sem_t *sem_open(const char *name, int oflag, mode_t 模式, unsigned int 值); 如果在 oflag 中指定了 O_CREAT,则需要两个附加参数 必须提供。 mode 参数指定权限 被放置在新的信号量上,该值 参数指定新信号量的初始值。 注意:我不能使用 sem_init,因为最终代码需要在 Macos 上完成。我只是用 sem_getvalue() 在 Linux 上重新创建这个来了解问题。 根据@pilcrow的建议,我将问题重新创建为: #include <stdio.h> #include <pthread.h> #include <semaphore.h> sem_t *mutex; void* thread(void* arg){ printf("Entered thread\n"); sem_wait(mutex); printf("Hello\n"); sem_post(mutex); pthread_exit(NULL); } int main() { mutex = sem_open("mutex", O_CREAT, 0644, 1); if(mutex == SEM_FAILED){ printf("Failed to create semaphore\n"); return 1; } pthread_t id; pthread_create(&id,NULL,thread,NULL); pthread_join(id,NULL); return 0; } 输出: Entered thread 线程继续无限期地等待 mutex 信号量,而该信号量再次未正确初始化。 命名信号量由 /somename 形式的名称标识;也就是说,最多为 NAME_MAX-4 的以空结尾的字符串 (即 251)个字符,由一个初始斜杠组成,后跟一个或多个字符,其中没有一个是斜杠。二 通过将相同的名称传递给 sem_open(3),进程可以对同一个命名的信号量进行操作。 sem_open(3)函数创建一个新的命名信号量或打开一个现有的命名信号量。信号量被设置后 打开后,可以使用sem_post(3)和sem_wait(3)进行操作。当进程使用完信号量后,它可以 使用 sem_close(3) 关闭信号量。当所有进程都使用完该信号量后,可以将其从 系统使用 sem_unlink(3). 多个进程可以打开同一个信号量,这意味着它必须存在于进程范围之外的某个地方 它需要手动取消链接,这表明即使每个打开它的进程都调用了sem_close(),它仍然存在(否则当引用计数变为零时它可能会被销毁)。 在 Linux 上的 strace 下运行测试过程表明信号量由文件 /dev/shm/sem/mutex 支持。其他平台可能有不同的支持位置,但必须支持相同的语义。 需要手动取消链接信号量的明显推论是,如果您不,那么每次您使用相同的名称打开它时都会得到相同的信号量,其中包含先前运行的最后一个值。 如果您确实只想在单个进程中使用信号量并且不能使用未命名的信号量(使用 sem_init()),那么您应该确保名称是唯一的。从 PID 形成一个字符串将是一个好的开始,退出时取消链接也是如此。

回答 1 投票 0

Semaphore 和 SemaphoreSlim 使用最佳实践

我在此类之上创建了一个信号量实例 公共静态 SemaphoreSlim _zReportSemaphore = 新 SemaphoreSlim(1, 500); 在我的代码中的某个地方,我需要检索和发送一些数据。 ...

回答 2 投票 0

在 Python 线程中模拟取消令牌

我刚刚用Python写了一个任务队列,其作用是限制一次运行的任务数量。这与 Queue.Queue 有点不同,因为不是限制可以有多少个项目......

回答 4 投票 0

使用共享内存的服务器-客户端模型

我有以下程序,但无法使其在客户端和服务器之间正确同步。 运行后,我的程序总是以客户端和服务器之间的冲突而告终,试图...

回答 1 投票 0

SemaphoreSlim 等待优先级

我想知道 SemaphoreSlim 在调用 Await 时是否有类似优先级的东西。 我找不到任何东西,但也许以前有人做过类似的事情。 这个想法是,如果我

回答 2 投票 0

跨 32 和 64 位进程的 POSIX 信号量

我正在尝试使用信号量同步2个进程。第一个进程是32位,第二个是64位。 在Windows下,我使用CreateSemaphoreA、WaitForSingleObject和ReleaseSemaphore API。它适用于...

回答 1 投票 0

vkAcquireNextImageKHR 为 VK_SUBOPTIMAL_KHR 后如何重新创建交换链?

这个 vulkan 教程讨论了交换链重建: 如果交换链不是最优的,您也可以决定[重新创建交换链],但我选择在这种情况下继续进行,因为......

回答 2 投票 0

什么时候调用sem_unlink()?

我对 Linux API sem_unlink() 有点困惑,主要是何时或为何调用它。我在 Windows 中使用信号量已经很多年了。在 Windows 中,一旦关闭命名信号量的最后一个句柄...

回答 3 投票 0

Semaphore/Ansible 默认以 root 身份运行命令

因为我在 Ansible/Semaphore 方面是菜鸟,所以我需要帮助。 我从这个链接安装了信号量: RL8 上的信号量安装 该服务正在运行,我已经创建了使用...

回答 1 投票 0

子进程不会修改父进程中的统计信息

我正在开发一个涉及多个进程(包括子进程和父进程)的 C 应用程序,并且我尝试使用共享内存和信号量在它们之间共享统计信息。怎么...

回答 1 投票 0

使用 Task.WhenAny 等待 SemaphoreSlim 上的容量

我有一个异步处理管道。我正在实施一个约束,以便我需要限制下一阶段的提交数量。对于我的组件,我有: 单个输入源(项目是

回答 2 投票 0

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