Questions tagged «deadlock»

两个(或多个)操作需要重叠的资源集,而两个都不能完成的情况,因为它们无法获得完成一个操作并释放其锁所需的所有锁。


8
如何避免mysql'试图获取锁时发现死锁;尝试重新开始交易”
我有一个记录在线用户的innoDB表。用户每次刷新页面时都会更新该信息,以跟踪他们所访问的页面以及它们对该站点的最后访问日期。然后,我会有一个cron,每15分钟运行一次,以删除旧记录。 我在尝试获取锁时发现“死锁;昨晚尝试重新启动事务”大约5分钟,这似乎是在向该表中运行INSERT时出现的情况。有人可以建议如何避免此错误吗? ===编辑=== 以下是正在运行的查询: 首次访问网站: INSERT INTO onlineusers SET ip = 123.456.789.123, datetime = now(), userid = 321, page = '/thispage', area = 'thisarea', type = 3 在每个页面上刷新: UPDATE onlineusers SET ips = 123.456.789.123, datetime = now(), userid = 321, page = '/thispage', area = 'thisarea', type = 3 WHERE …
286 mysql  deadlock 

3
等待vs Task.Wait-死锁?
我不太明白之间的差别Task.Wait和await。 我在ASP.NET WebAPI服务中具有类似于以下功能的内容: public class TestController : ApiController { public static async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } // GET api/test public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => …

7
递归锁(Mutex)与非递归锁(Mutex)
POSIX允许互斥量是递归的。这意味着同一线程可以锁定同一互斥锁两次,并且不会死锁。当然,它还需要将其解锁两次,否则其他线程将无法获得该互斥锁。并非所有支持pthread的系统都支持递归互斥锁,但是如果要符合POSIX,则必须这样做。 其他API(更高级的API)通常也提供互斥体,通常称为“锁定”。某些系统/语言(例如Cocoa Objective-C)提供递归和非递归互斥体。有些语言也只提供其中一种。例如,Java互斥锁始终是递归的(同一线程可能在同一对象上两次“同步”两次)。根据它们提供的其他线程功能的不同,不使用递归互斥可能没有问题,因为可以很容易地自己编写(我已经在更简单的互斥/条件操作的基础上实现了递归互斥)。 我不太了解的是:非递归互斥锁有什么用处?如果两次锁定同一个互斥锁,为什么还要线程死锁?即使是可以避免这种情况的高级语言(例如,测试是否会死锁并在发生异常时抛出异常)通常也不会这样做。他们会让线程死锁。 这是否仅适用于以下情况:我不小心将其锁定两次,而仅将其解锁一次,并且在递归互斥的情况下,将很难发现问题,因此我立即使其死锁,以查看错误的锁定出现在何处?但是在解锁时返回锁计数器是否可以做同样的事情,在这种情况下,我确定我释放了最后一个锁并且计数器不为零,我可以抛出异常或记录问题吗?还是我没有看到其他任何更有用的非递归互斥用例?还是仅仅是性能,因为非递归互斥锁可能比递归互斥锁快一点?但是,我对此进行了测试,但差异实际上并没有那么大。


5
'await'有效,但调用task.Result挂起/死锁
我有以下四个测试,运行时最后一个挂起。为什么会这样: [Test] public void CheckOnceResultTest() { Assert.IsTrue(CheckStatus().Result); } [Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceAwaitTest() { Assert.IsTrue(await CheckStatus()); Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // This hangs Assert.IsTrue(await CheckStatus()); } private async Task<bool> CheckStatus() { var restClient = new …
126 c#  nunit  task  deadlock  async-await 

4
C#中的重入锁
下面的代码是否会在.NET上使用C#导致死锁? class MyClass { private object lockObj = new object(); public void Foo() { lock(lockObj) { Bar(); } } public void Bar() { lock(lockObj) { // Do something } } }

4
进程成为死锁受害者的原因
我有一个选择过程,需要很长时间才能完成,大约需要5到10分钟。我目前不使用NOLOCK作为对MS SQL数据库引擎的提示。同时,我们还有另一个过程进行更新,并将其插入相同的数据库和相同的表中。第一个过程已经开始,最近以消息提前结束 SQLEXCEPTION:事务已在另一个进程的锁定资源上死锁,并且已被选择为死锁受害者。 该第一个过程在其他条件相同的站点上运行,但数据库较小,因此,所选择的select语句花费的时间短得多(大约30秒左右)。在这些其他站点中,我没有在这些其他站点中收到死锁消息。我也没有在最初出现问题的站点上收到此消息,但是,我认为,随着数据库的增长,我相信我一定已经超过了一些门槛。这是我的问题: 事务执行所花费的时间是否会使关联的进程更有可能被标记为死锁受害者。 如果我使用NOLOCK提示执行选择,是否可以解决问题? 我怀疑在select语句中作为WHERE子句的一部分检查的datetime字段会导致查找时间变慢。我可以基于此字段创建索引吗?这是明智的吗?

5
导致死锁的异步/等待示例
我遇到了一些使用c#的async/ await关键字进行异步编程的最佳实践(我是c#5.0的新手)。 给出的建议之一如下: 稳定性:了解您的同步上下文 ...某些同步上下文是不可重入的和单线程的。这意味着在给定时间只能在上下文中执行一个工作单元。Windows UI线程或ASP.NET请求上下文就是一个例子。在这些单线程同步上下文中,很容易使自己陷入僵局。如果您从单线程上下文中生成任务,然后在上下文中等待该任务,则您的等待代码可能会阻止后台任务。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 如果我自己剖析,则主线程会生成一个新线程MyWebService.GetDataAsync();,但是由于主线程在此等待,因此它将在中等待结果GetDataAsync().Result。同时,说数据准备好了。为什么主线程不继续其继续逻辑并从中返回字符串结果GetDataAsync()? 有人可以解释一下为什么上面的示例中出现死锁吗?我完全不知道问题是什么...

6
C ++终止调用,没有活动异常
我在线程获取C ++错误: terminate called without an active exception Aborted 这是代码: #include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename TYPE> class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &operator<<(TYPE &other) { std::unique_lock<std::mutex> mtx_lock(mtx); while(buffer.size()>=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP …

28
简单的死锁示例
我想向新手解释线程死锁。过去,我看到过很多死锁的示例,有些使用代码,有些使用插图(例如著名的4辆汽车)。还有诸如The Dining Philosophers之类的容易陷入僵局的经典问题,但是对于真正的新手来说,这些问题可能太复杂而无法完全掌握。 我正在寻找最简单的代码示例来说明什么是死锁。该示例应: 与有意义的“真实”编程场景有关 简短,简单明了 您有什么推荐的吗?

3
如何捕获死锁引起的SqlException?
我想从.NET 3.5 / C#应用程序捕获,SqlException但前提是它是由 SQL Server 2008实例上的死锁引起的。 典型的错误信息是 Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 但是,它似乎不是针对此异常的已记录错误代码。 针对他们的消息中存在的Deadlock关键字过滤异常似乎是实现此行为的非常难看的方法。有人知道这样做的正确方法吗?

13
编写一个肯定会陷入僵局的程序[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 我最近在一次采访中提出了这个问题。 我回答说,如果交织出错,就会发生死锁,但是访调员坚持认为,可以编写一个无论交织而总是陷入死锁的程序。 我们可以编写这样的程序吗?您能指出我这样的示例程序吗?

3
为什么在静态初始化程序中使用lambda进行并行流会导致死锁?
我遇到了一个奇怪的情况,在静态初始化程序中使用带有lambda的并行流似乎永远没有CPU使用率。这是代码: class Deadlock { static { IntStream.range(0, 10000).parallel().map(i -> i).count(); System.out.println("done"); } public static void main(final String[] args) {} } 这似乎是此行为的最小再现测试用例。如果我: 将块放入main方法而不是静态初始化程序中, 删除并行化,或 删除lambda, 代码立即完成。谁能解释这种行为?它是错误还是故意的? 我正在使用1.8.0_66-内部的OpenJDK版本。

8
如何在JavaScript中实现锁定
如何lock在JavaScript中实现与C#等效的功能? 因此,解释一下我在想一个简单的用例是: 用户单击按钮B。 B引发一个onclick事件。如果B是在event-state事件等待B是在ready-state传播之前。如果Binready-state中的B被锁定并设置为event-state,则事件传播。事件的传播完成后,B设置为ready-state。 我可以看到仅通过ready-state在按钮中添加和删​​除类,就能完成与此类似的事情。但是,问题在于用户连续单击按钮的时间比设置变量的速度快两次,因此在某些情况下,这种锁定尝试将失败。 有谁知道如何实现在JavaScript中不会失败的锁?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.