问题标签 [locking]

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 投票
2 回答
694 浏览

vba - 从 Excel 2003 升级到 2007 会导致以前工作的 vba 出现“堆栈溢出错误”

以下 VBA 代码在 Excel 2003 中运行良好,但在 Excel 2007 中会导致堆栈溢出错误。根据下拉菜单选择解锁或锁定某些单元格需要该代码。我需要能够在 Excel 2003 和 2007 中运行代码。请帮忙。

0 投票
3 回答
500 浏览

sql-server - Sql Server 2005 - 管理表的并发性

我有一个 ASP.NET 应用程序这个过程:

  • 开始连接
  • 开始交易
  • 使用包含特定 LoadId 的列的 SqlBulkCopy 类将大量值插入到表“LoadData”中。
  • 调用一个存储过程:
    • 阅读特定 LoadId 的表“LoadData”。
    • 对于每一行进行大量计算,这意味着读取数十个表并将结果写入临时(#temp)表(持续几分钟的过程)。
    • 删除特定 LoadId 的“LoadDate”中的行。
    • 一切完成后,将结果写入结果表中。
  • 如果发生故障,提交事务或回滚。

我的问题是,如果我有 2 个用户启动该进程,第二个用户将不得不等待前一个用户完成(因为插入似乎在表上设置了排他锁)并且我的应用程序有时会超时(并且用户不乐意等待 :) )。

我正在寻找一种方法,让用户能够并行执行所有操作,因为没有交互,除了最后一个:编写结果。我认为阻止我的是“LoadData”表中的插入/删除。我检查了其他事务隔离级别,但似乎没有什么可以帮助我。

当插入完成但不结束事务时,能够删除“LoadData”表上的排他锁(是否可以强制 SqlServer 仅锁定行而不锁定表?)将是完美的。

有什么建议吗?

0 投票
4 回答
347 浏览

.net-2.0 - 如何确保获取和设置操作的原子性以重定向 Console.Out 以记录控制台输出?

我需要拦截控制台输出流以便将其捕获为日志,但仍将内容传递给原始流,以便应用程序正常工作。这显然意味着在将原始Console.OutTextWriter 更改为Console.SetOut(new MyTextWriterClass(originalOut)).

我假设获取 Out 属性和调用 SetOut() 方法的各个操作Console是以线程安全的方式实现的。但我想确保其他一些线程(例如,运行我无法控制且无法更改的客户端应用程序代码,因此我不能依赖我自己的自定义锁定方案)不能在我的 get 和 set 之间意外更改它,最终被我对它的更改覆盖(破坏了他们的应用程序的行为!)。由于其他代码可能只是调用 SetOut(),因此我的代码理想情况下应该获得内部使用的相同锁Console(假设有一个)。

不幸的是,Console是一个(静态)类,而不是一个实例,所以你不能只是lock (Console). 在类文档中查看似乎没有提到锁定。这不是这些 Console 方法的通常预期用法,但应该有一些安全的方法来作为原子操作执行此操作。

如果标准锁定方案失败,是否有其他方法可以确保这一点?对于如此短的关键部分(并且只完成一次),即使是暂时阻塞所有其他线程也是可以接受的,如果这是唯一的方法的话。我们正在使用 C# 和 .NET2.0。

如果这甚至不可能(不中断客户端应用程序),那么我们将不得不依赖它,客户端应用程序不太可能重定向其控制台输出碰巧在我们的 get 和 set 操作之间进行。我只想覆盖所有的基础,以防万一。

编辑:现在我们有了示例代码的具体答案,我已经改写了问题标题,以更普遍地反映答案可以提供帮助的用例,更清楚。此外,还为“原子”添加了一个标签。

0 投票
2 回答
4596 浏览

java - Java 6 JVM 挂起

很抱歉这篇长篇文章,但我想知道在我向 Sun 提交错误报告之前是否可以得到更多的关注。

JVM:6u11
操作系统:Windows XP SP3
硬件:AMD Athlon 64 X2 4600+ @ 2.41GHz,3.25 GB RAM。

我相信我在 JVM 中遇到了一个错误,没有为线程提供监视器。在以下线程跟踪中,监视器<0x12a8f9f8>被 获取RelayedMessages-0000000001,最终等待它;随后通知了该线程。然而,即使列出的所有线程都在争夺监视器,但没有一个线程得到它。

我保证线程转储对于每个引用 monitor 的线程都是完整的<0x12a8f9f8>。转储是使用 Java VisualVM 获得的,在 16 小时内 3 次,并且每次都显示是一致的(这些线程没有变化)。

有没有人不同意我的评估,即 JVM 未能将监视器交付给任何符合条件的线程,什么时候应该将它交付给其中一个?

0 投票
23 回答
89821 浏览

python - 确保只有一个程序实例正在运行

是否有一种 Pythonic 方式可以只运行一个程序实例?

我想出的唯一合理的解决方案是尝试在某个端口上将其作为服务器运行,然后第二个程序尝试绑定到同一端口 - 失败。但这并不是一个好主意,也许还有比这更轻量级的东西?

(考虑到程序有时会失败,即段错误 - 所以像“锁定文件”这样的东西不会起作用)

0 投票
1 回答
1547 浏览

c# - 将 ReaderWriterLockSlim UpgradeableReadLock 降级为简单的 ReadLock

文档ReaderWriterLockSlim.EnterUpgradeableReadLock说:

可升级模式下的线程可以降级到读取模式或升级到写入模式。

如何将锁降级为读锁?文档没有告诉...

[编辑:]我不想获得写锁。我只想将可升级锁降级为读锁,以便另一个线程可以获取可升级锁。

0 投票
2 回答
1723 浏览

.net - 使用 ReaderWriterLockSlim 会导致内存障碍吗?

如果我ReaderWriterLockSlim用来获取读/写锁,我需要制作变量volatile还是使用Interlocked.Increment

例如,Add下面方法中的代码是否可以正常工作,还是需要增强?

编辑:我正在尝试编写一个轻量级、快速且简单的列表,该列表允许多个线程同时访问其数据(类似于生产者-消费者缓冲区)。我已经编辑了上面的代码,删除了我之前使用的简化,所以现在问题应该更清楚了。在我看来,这段代码是线程安全的,但我不确定Count在退出可升级锁后是否所有线程都会看到更新的值。

编辑2:这里的“写”锁用于指示写入数组引用,而不是数组元素。我假设这已经足够了(因为数据本身是不可变的)。我想我需要在递增时使用 Interlocked Count。真的吗?

0 投票
3 回答
7207 浏览

sql-server - T-SQL 中的悲观锁

如果我在 MS SQL Server 中选择一行进行更新,并希望将其锁定直到我更新或取消,哪个选项更好:-

1) 使用像 UPDLOCK 这样的查询提示 2) 对事务使用 REPEATABLE READ 隔离级别 3) 任何其他选项。

谢谢,查克。

0 投票
3 回答
20825 浏览

.net - 如何找到 ManualResetEvent 的状态?

我正在使用 的实例ManualResetEvent来控制对资源的线程访问,但我遇到了问题。有谁知道我在调试过程中如何找出对象的状态?

也就是说,我想知道ManualResetEvent当前是否阻塞了任何线程,甚至可能阻塞了多少线程和哪些线程。

0 投票
14 回答
16477 浏览

postgresql - 在 Postgresql 中选择未锁定的行

有没有办法在 Postgresql 中选择未锁定的行?我有一个多线程应用程序可以执行以下操作:

在一张桌子上。

如果多个线程运行此查询,它们都会尝试拉回同一行。

一个获得行锁,另一个阻塞,然后在第一个更新行后失败。我真正想要的是让第二个线程获得与WHERE子句匹配且尚未锁定的第一行。

为了澄清,我希望每个线程在选择后立即更新第一个可用行。

因此,如果有带有 的行ID: 1,2,3,4,第一个线程会进来,选择带有 的行ID=4并立即更新它。

如果在该事务期间出现第二个线程,我希望它获取行ID=3并立即更新该行。

For Share 不会完成此操作,nowait因为WHERE子句将与锁定的行匹配(ID=4 in my example)。基本上我想要的是WHERE子句中的“AND NOT LOCKED”之类的东西。

如果查询是“ Select ID from users where flags = 0 order by ID desc limit 1”并且当返回一行时,下一个是“ Update Users set flags = 1 where ID = 0”,那么我希望第一个线程用 来抓取行,ID 4下一个线程用 来抓取行ID 3

如果我将“”附加For Update到选择,那么第一个线程获取该行,第二个线程阻塞然后什么都不返回,因为一旦第一个事务提交,该WHERE子句就不再满足。

如果我不使用“ For Update”,那么我需要在后续更新中添加一个 WHERE 子句(WHERE flags = 0),这样只有一个线程可以更新该行。

第二个线程将选择与第一个线程相同的行,但第二个线程的更新将失败。

无论哪种方式,第二个线程都无法获取行并更新,因为我无法让数据库将第 4 行提供给第一个线程,将第 3 行提供给第二个线程,事务重叠。