问题标签 [locks]

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 回答
411 浏览

sql-server - 链接到 SQL Server 的 Ms Access 表单无响应

不确定是否有明确的答案,但我有一个使用 SQL Server 2008 作为数据存储的 Ms Access 应用程序,所有表都从 Access 应用程序链接到 SQL Server,该应用程序托管在 Citrix 服务器上。应用程序中的所有表格都是绑定表格。当我尝试编辑或保存表单永远挂起的数据并且我必须终止会话时,最近有一种特定的表单会导致问题。该表单链接到 SQL Server 上的一个表,并且该表具有 Identity 列作为主键,我觉得奇怪的是该表单甚至没有像任何其他表单那样频繁使用,而且该表甚至没有任何一半的记录其他大量使用的表。表格上只有 4 个字段,只有一个字段是 Nvarchar,其他形式有更多的 Nvarchar 字段,具有更多的利用率和数据,它们似乎不会引起任何问题。我正在排除网络问题,因为这会影响整个应用程序,而不仅仅是一种形式,SQL 服务器上的索引也是每天构建的,所以我认为这也不是索引问题。有谁知道为什么会发生这种情况。

0 投票
2 回答
1290 浏览

objective-c - @同步与锁定/解锁

我是 Objective-C 的新手。我应该什么时候使用@synchronized,什么时候应该使用lock/unlock?我的背景主要是Java。我知道在 Java 中,获得显式锁允许您执行更复杂、广泛和灵活的操作(相对于发布顺序等),而synchronized关键字强制锁以块结构的方式使用,并且它们还必须以它们被收购的相反顺序发布。Objective-C 中是否存在相同的原理?

0 投票
2 回答
232 浏览

multithreading - 锁定是如何实现的?

我有以下代码:

因为读取或更改锁定值本身就是一条多指令

如果它发生如下:

那么如何在系统中实现锁定?将变量放在另一个变量之上是不对的:这就像守卫?

停止其他处理器线程也不对吗?

0 投票
2 回答
2009 浏览

c# - c#线程安全日志记录问题不使用单例

我正在用 C# 创建一个日志记录类,我需要它是线程安全的。我已经实现了 TextWriter.Synchronized 和锁,但是我遇到了一个非常奇怪的问题,锁似乎不起作用。

我不想使用单例或静态类,因为我希望能够在任何给定时间拥有此日志记录类的多个实例,并且我想根据日志的文件名同步线程。因此,如果我有 30 个线程和 3 个不同的 Log 类实例都使用相同的日志文件,它将正确同步并且没有任何问题。以下是我到目前为止的想法。我省略了一些不相关的代码,例如构造函数和关闭/处置。

为了测试这一点,我创建了 3 个指向同一个日志文件的记录器实例,创建 30 个线程并为每个线程分配一个记录器(按 1、2、3、1、2、3 的顺序),然​​后我运行所有30 线程,直到我按 q。

这对于在日志文件中逐行写入并保持写入发生的时间以正确的顺序非常有用,但这是我在日志文件中得到的内容。似乎该线程覆盖了日志文件的一部分,并且它似乎发生在不同线程上的不同记录器实例上,而不是不同线程上的相同记录器实例。下面的日志文件包含创建条目的时间、记录器 ID(基于 1)、线程 ID(基于 0)和消息“test”。

请注意,其中 2 行已损坏。我猜这是由于锁不能正常工作,或者是我误用了锁。我也不想使用排队或任何类型的单例。如果我将 WriteLine 中的锁更改为 m_SyncRoot 变量并使其成为非静态变量,则似乎不会发生这种行为。我不知道为什么会这样,但对我来说,这似乎不是我想做的。我也不想单独锁定静态 m_SyncRoot,因为如果我有 3 个记录器实例指向 3 个不同的日志文件,那么每个实例都会无缘无故地阻止另一个。

我对此很迷茫,我完全搞砸了吗?

如果有人需要,这里是生成线程的测试类

编辑:按照建议将静态 m_ 更改为 s_ 并将 AutoFlush 属性添加到 StreamWriter;将其设置为 true... 仍然无法正常工作。

0 投票
0 回答
73 浏览

sql - 等待在同一事务中获取先前更新的行的读锁

在具有读提交隔离级别的事务中,如果您对一组行进行更新,然后对同一组行进行选择,则 sql server 在执行更新时不会重用它在索引上获取的 x 锁以执行下一个select 还是会尝试在索引上获取一组新的锁。我遇到了一个死锁场景,其中两个进程正在争夺一个索引键锁——被锁定的两个资源之一。当其中一个进程已经完成更新然后对相同的行进行选择时,就会发生这种情况。我的问题是,当该进程在上一步中已经获得同一行的 x 锁时,它如何等待获取索引上的键锁。

0 投票
1 回答
355 浏览

macos - mach内核,锁的最佳用法

我正在寻找有关如何设计 Mac OS X 网络内核扩展的特定部分以尽可能快速和高效的建议或指示——C 语言。

描述: 我有两组 TAILQ 列表。一个用于 A 型结构,另一个用于 B 型结构。大多数情况下,我分别处理它们,因此每个都有一个 lock_mtx。有时,我需要修改 A,然后是 B,然后同时修改两者。它看起来像这样:

我不熟悉锁的使用。所以我只看到两个选项: 1. 使用一个锁来保护两个列表。那将是一种浪费,因为它会阻止仅修改 A 的函数在执行时仅执行修改 B 的函数(反之亦然)。

  1. 依次获取两个锁,然后释放它们。那会给我:

.

我认为这将是相当昂贵的,拿走所有这些锁。有没有更好的方法来保护 A 和 B 的交叉修改?

感谢您的建议。

0 投票
1 回答
467 浏览

scala - 具有对对象共享缓存、scala.concurrent.Lock、反应与接收的并发访问权限的 Scala 演员

我正在编写一个软件,其中各种参与者同时创建同一个图形的部分。

图的节点通过类层次结构建模,层次结构的每个具体类都有一个伴生对象。

到目前为止,一切都很好。

我们在创建时对节点执行结构哈希。也就是说,每个伴生对象都有一个 HashTable 存储节点实例,该节点实例以它们的构造函数参数为键,这用于检测具有相同子节点的给定节点类的实例是否已经存在,并返回该实例而不是创建新实例。这可以避免内存爆炸,并允许进行需要恒定时间的节点相等测试(参考比较而不是图形比较)。使用 scala.concurrent.Lock 保护对该映射的访问。

然而问题在于 Lock 在 jvm 线程级别上运行,并且根据 actor 的编码方式,它们可以分配在它们自己的 jvm 线程上,或者与同一个 JVM 线程中的几个其他 actor 交错,在这种情况下结构哈希不再起作用(即,可以创建几个结构相同的节点,并且只有其中一个会存储在缓存中,结构相等性将不再起作用)。

首先,我知道这种结构化哈希架构违背了参与者无共享的理念,但是出于性能原因,我们确实需要这种哈希来工作(恒定的时间相等性给我们带来了一个数量级的改进),但是有没有办法实现相互与将在参与者级别而不是 jvm 线程级别工作的参与者共享资源的排除?

我想过将节点伴侣封装在一个actor中以完全顺序访问工厂,但这意味着对所有现有代码的完全重写,还有其他想法吗?

谢谢,

0 投票
4 回答
9279 浏览

c# - 事务和锁

我目前正在处理交易并感到困惑。这些事务是在数据访问层而不是在数据库的存储过程中创建的 (SQL Server 2008)。我了解为交易设置的隔离级别的正常工作。我无法理解在以下情况下会发生什么。

  1. 发起交易
  2. 选择 ID=1 的员工。
  3. 更新 ID=1 的员工。
  4. 犯罪

有多个线程在做同样的事情,但 ID 不同。但可能存在两个线程查找相同 ID 的情况。让我们称它们为线程 A 和 B。对于两个线程,上述步骤按以下方式进行。隔离级别设置为可重复读取。

A1。启动事务 A2。选择 ID=1 的员工。B1。发起交易 B2。选择 ID=1 的员工。A3。更新 ID=1 的员工。A4。提交 B3。更新 ID=1 的员工。B4。犯罪

我真正想从事务中实现的是,当线程 A 选择特定记录时,线程 B 甚至应该无法选择该记录。我不知道我是否通过在这种情况下使用事务和锁来思考正确的轨道。

等待回复:)

0 投票
1 回答
2210 浏览

c - C中的信号量锁解决方案

如何解决以下实现信号量同步的问题...

出于这个问题的目的,我们将对交叉路口进行建模,如上所示,将其划分为四分之一,并确定每个四分之一车道通过该部分进入交叉路口。(澄清一下:我们在道路的右侧行驶。)转弯表示通过交叉路口的一个、两个或三个部分的进展(为简单起见,假设在交叉路口不发生 U 形转弯) . 因此,如果一辆车从北方接近,根据它的去向,它会按如下方式通过十字路口:

谁先到达路口,谁先行。

没有两辆车可以同时在交叉路口的同一部分。不要彼此通过相同的方式。如果两辆车从同一个方向接近并朝同一个方向行驶,那么最先到达交叉路口的汽车应该是最先到达目的地的汽车。同样,汽车不应该在十字路口相互“跳跃”。例如,假设一辆车进入十字路口并直行。然后另一辆车从同一方向进入交叉路口并向左行驶。第二辆车应该在第一辆车之后离开路口。然而,假设一辆车进入交叉路口并且向左行驶。如果另一辆车从同一方向进入交叉路口并向右行驶,那么它可能会更早离开交叉路口,因为第一辆车,即使它领先于第二辆车,可能还不能左转。每辆车在接近交叉口(接近)时应打印一条消息,进入交叉口的一个或多个区域((区域1),区域2和区域3),离开交叉口(离开),指示车号,接近方向和目的地方向。

从给定方向接近交叉路口的汽车应以相同的顺序进入交叉路口。请注意,在汽车接近交叉路口以减速之前不应进行同步。换句话说,不要在进入交叉路口的区域1之前简单地打印接近,例如,两个事件之间应该有一个同步原语。没有其他订购要求。例如,对于从不同方向接近的汽车,没有订购要求。我应该允许两辆或更多辆汽车同时进入十字路口,而不允许来自任何方向的交通使来自任何其他方向的交通饿死。

createcars 创建 20 辆汽车并将它们传递到接近交叉路口,为每辆汽车分配一个随机方向。我需要为他们分配一个随机的转弯方向;我也可以在接近交叉路口执行此操作。

其他例程 gostraight、turnright 和 turnleft 可能有助于或可能不会有助于实施此解决方案。我可以使用它们或丢弃它们。

这是一辆车(8 号车)从东方到达并朝西方行驶的示例输出。请注意,区域(例如,区域 1)是相对于每辆汽车定义的。向右行驶的汽车将输出 region1。直线行驶的汽车将输出 region1 和 region2。向左行驶的汽车将输出 region1、region2 和 region3。

以下是我的例程..

0 投票
1 回答
1887 浏览

java - 增加锁数量的最佳方法是什么?

此问题基于Synchronizing on an Integer results in NullPointerException并源自此问题Synchronizing on an Integer value

我想知道在 Java 中增加锁数量的最佳方法是什么。除了ConcurrentHashMap在即基于固定数组并通过计算键的哈希来引用数组的索引来实现之外?

以下是预期的。如果doMoreThing()一个对象正在处理中,那么doAnotherThing()如果它从不同的线程调用,我不应该为同一个对象做。