问题标签 [semaphore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1262 浏览

c# - .NET 并发问题:我可以向另一个线程产生信号量吗

我有多个线程共享信号量的使用。线程 A 持有信号量(使用锁),线程 B 和 C 正在等待同一个信号量(也使用锁)。线程共享全局变量等。

C# 中是否有可以用来关闭线程 B 的技术?我可以在 A 中设置一个标志,让线程 B 检查该标志并在它控制信号量后立即退出,但我不知道有任何技术可以让线程 A 将信号量交给线程 B(并得到它当线程 B 退出时返回)没有线程 C 夺取控制权的风险。

有人对如何解决这个设计问题有任何建议吗?如果我不正确地处理这个问题,我可以根据需要重写程序。

[编辑] 一位评论者指出我使用了错误的术语。评论者是正确的 - 我正在使用一个关键部分,但鉴于一切都在一个进程中运行,在这个例子中,关键部分在功能上等同于更通用的术语“信号量”。

[编辑] 有人询问更多细节,所以在这里。

可以有多个线程执行代码 A。只有一个线程执行代码 B。

代码 A:

代码 B:

我怀疑我将使用 Aaron 解决方案的变体。我主要希望有一些更优雅的解决方案可用,但我怀疑就像这个项目的其他一切一样,这都是蛮力和极端情况:-(。

0 投票
1 回答
487 浏览

c# - 检查信号量的每个线程是否已完成

我有一个通过 Job 对象列表运行的信号量。

这是代码示例:

每个作业对象都有一个状态成员变量a(0:新,1:inProgress,2:已完成,3:completeWithErrors)。

我想知道在继续执行脚本之前检查列表中的每个作业是否已完成的最佳方法是什么。

注意:我之前尝试过使用 ThreadPool 和 WaitAll,但它确实允许我像信号量那样拥有有限数量的线程(没有辅助效果),而且我还遇到了 ManualResetEvent 数组大小的限制,因为它是Windows 窗体。

0 投票
1 回答
1169 浏览

c# - 运行线程时 Windows 窗体挂起

JI 在 Visual Studio 2008 中编写了一个 .NET C# Windows 窗体应用程序,该应用程序使用信号量在按下“开始”按钮时将多个作业作为线程运行。

在运行 40 分钟或更长时间后,遇到了表单进入逗号的问题。日志文件表明当前作业已完成,它从列表中选择一个新作业,然后挂起。

我注意到发生这种情况时,Windows 窗体会变得无响应。该表单在其自己的线程中运行。

这是我正在使用的代码示例:

//形成方法

//job.process()

我试图将我所能做的记录到一个文件中以检测问题发生的位置,但到目前为止我还无法确定发生这种情况的位置。失去对 Windows 窗体的控制让我认为这与处理作业无关。有任何想法吗?

解决方案: 使用 RedGate ANTS 对其进行分析会产生问题。直接运行时不会发生。

0 投票
1 回答
1249 浏览

mutex - 测量互斥体或 futex 延迟

如何测量互斥量、信号量或 futex 的延迟?我的意思是两个事件之间的延迟:解锁先前锁定的互斥锁和锁定该互斥锁。有两种情况:当所有线程/进程都在同一个 CPU 上时(重新调度线程需要多长时间)以及当第一个线程在第一个 CPU 上而第二个线程在第二个 CPU 上时。

甚至

这个时间很短(~1 k 个周期),所以我不能使用gettimeofday()

0 投票
2 回答
228 浏览

.net - 如何在 .NET 中创建可继承的信号量?

我正在尝试创建一个可继承的 Win32 Semaphore 对象。这意味着我启动的任何子进程都可能自动有权对同一个 Win32 对象进行操作。

我的代码目前如下所示:

但是这段代码中的信号量对象不能被子进程使用。


我正在编写的代码是工作 C++ 的一个端口。旧的 C++ 代码通过以下方式实现这一点:

然后稍后当CreateProcess被调用时,bInheritHandles参数设置为TRUE

(在 C# 和 C++ 的情况下,我使用相同的子进程(即 C++)。它在命令行上获取信号量 ID,并在调用中直接使用该值ReleaseSemaphore。)


我怀疑我需要构造一个特殊的SemaphoreSecurityProcessStartInfo对象,但我还没有弄清楚。

0 投票
1 回答
2584 浏览

c - 信号量和 sem_wait() 的问题

我有一个被多个 pthreads 使用的队列结构。如果队列不为空,线程应该从队列中出列,然后执行它们的业务。

我最初将此设置为一个while循环,其中线程使用互斥锁检查队列是否为空。不幸的是,这让我的程序慢了下来。

我尝试将信号量实现为队列的“计数”变量,但不幸的是,当我尝试调用 sem_wait() 时遇到了段错误。我发现 gdb 和 semaphore.h 不能很好地结合在一起,所以我真的很茫然。我可能会犯一个新手错误,所以任何帮助或建议将不胜感激。

队列结构:

这是它的初始化:

我确保我打电话给:

在创建任何线程之前。

这是段错误的调用

我希望这只是我现在看不到的一个简单错误。

提前致谢。

编辑:添加一些澄清代码

0 投票
1 回答
3574 浏览

c# - 保证信号量顺序?

.NET Semaphore 类的文档指出:

阻塞的线程进入信号量没有保证的顺序,例如 FIFO 或 LIFO。

在这种情况下,如果我想要保证订单(FIFO 或 LIFO),我有哪些选择?这是一件不容易的事情吗?我必须编写自己的信号量吗?我认为那将是相当先进的?

谢谢,

史蒂夫

0 投票
2 回答
2167 浏览

c# - 如何用监视器替换此信号量?

在我之前的问题中,有人说在 C# 中使用信号量比使用监视器要昂贵。所以我问这个,如何用监视器替换这段代码中的信号量?

在function2(在单独的线程中)完成后,我需要function1返回它的值。我已经Semaphore.WaitOne用 aMonitor.Wait和a 替换了Semaphore.Releasea ,Monitor.PulseAll但是在导致程序挂起PulseAll之前被触发了。Wait知道如何避免这种竞争条件吗?

0 投票
1 回答
177 浏览

c - 使用 Posix 信号量检测请求

您知道我们可以通过函数 mq_receive() 使用消息队列;用信号量实现该功能(你知道,等到共享数据更改)的好方法是什么?

0 投票
1 回答
2528 浏览

c - c中的semaphores.h和threads.h

你好,我需要为 c 安装和库我正在使用 linux ubuntu o/s。有人知道我如何安装它们吗?