问题标签 [deadlock]
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.
deadlock - 死锁的常见原因有哪些?
死锁很难找到,而且很难消除。
如何在我的代码中找到死锁的错误源?有没有“死锁模式”?
在我的特殊情况下,它处理数据库,但这个问题对每个死锁都是开放的。
multithreading - 如何在不锁定的情况下将数据从一个线程输出到另一个线程?
我正在开发一个 DirectShow 应用程序。我遇到了一个死锁问题,这个问题似乎是由线程调用的回调函数中的获取锁引起的。这是我在 MSDN 论坛中提出的问题:
现在我必须避免在该线程中获取锁。但问题是,我必须将音频输出到另一个线程,我怎样才能将数据不加锁地放到另一个线程?
有人告诉我,我可以使用 win32 sdk 的 PostMessage 将数据发布到另一个线程。但是,为了得到消息,我必须运行一个 Windows 程序。我的程序是一个 Python C++ 扩展模块。添加循环来拉取消息可能非常困难。所以我认为另一种在线程之间传递数据而不锁定的方法。(其实……生产者线程不能被锁定,但是消费者线程可以做到。)
锁还是不锁,这是个问题。
那么问题来了怎么办?
谢谢。
- - - 编辑 - - -
我想我知道为什么会出现死锁,那可能不是 DirectShow 的问题。
主线程是Python自己的,调用stop,即持有GIL。并在线程返回中停止等待 DirectShow 的回调。但是回调获取 GIL。
看起来像这样
Main(Hold GIL) -> Stop(Wait callback) -> Callback(Wait GIL) -> GIL(Hold by Main thread)
该死的!这就是为什么我不太喜欢多线程的原因。不管怎样,谢谢你的帮助。
sql-server - 删除选择中的死锁
以下 SQL 语句偶尔会在我的 mssqlserver 2000 服务器中产生死锁
出于某种原因,删除获得了阻塞状态并且没有完成(?)我发现被此阻塞的唯一其他进程是在周末运行以重新创建索引的维护计划,所以我不知道有什么可以正在产生问题。
这是删除生成的锁...
有人对如何找到问题的根源有任何指示吗?我怀疑表 tb_intervaloServico 是阻塞的根,因为它在删除和选择中被调用,但我无法重现该行为。
c - 这种僵局隐藏在哪里?
我实际上正在编写一个 MPI 程序。这是一个基本的客户端/服务器模式。服务器有一组工作要计算。客户得到这个大集合的子集。每个客户端使用多个线程来计算子集。在向服务器请求另一个子集之前,我必须确保所有线程都已完成。
客户端分为几个线程:一个主线程(用于通信)和几个工作线程。
这是我的实际代码,应该发生死锁。我清除了任何 MPI 调用,使其更具可读性。我真的看不出我在这里做错了什么。
c# - 死锁 lock() 方法
我面临死锁,我的代码结构类似于:
但是使用相同的代码,我只是像这样修改了 UpdateControl 方法:
这工作正常。问题是什么?
windows - pthread 和 CreateThread 的死锁
我在 Windows 应用程序中使用 pthreads。我注意到我的程序陷入僵局——快速检查表明发生了以下情况:
线程 1 产生线程 2。线程 2 产生线程 3。线程 2 等待来自线程 3 的互斥锁,该互斥锁未解锁。
所以,我去gdb调试,回溯第三个线程时得到以下信息:
它在 Windows CreateThread 函数中以某种方式卡住、死锁!显然,当它甚至无法开始执行代码时,它也无法解锁互斥锁。然而,尽管它显然被困在这里,但 pthread_create 返回零(成功)。
让这特别奇怪的是,Linux 上的同一个应用程序没有这样的问题。到底什么会导致线程在创建过程中挂起(!?)但成功返回,就好像它已正确创建一样?
编辑:响应代码请求,这里有一些代码(简化):
线程的创建:
请注意,它一直等到 b_thread_active 被设置,所以不知何故 b_thread_active 被设置了,所以被调用的线程必须做了一些事情......
...这是lookahead_thread函数:
lookahead_slicetype_decide (h); 是线程所做的事情。
互斥体,synch_frame_list_get_size:
线程2的回溯:
orm - ORM 支持处理死锁
你知道任何提供死锁恢复的 ORM 工具吗?我知道死锁是一件坏事,但有时在适当的负载量下任何系统都会受到它的影响。在 Sql Server 中,死锁消息显示“重新运行事务”,因此我怀疑重新运行死锁语句是 ORM 的理想功能。
java - Log4j 正在挂起我的应用程序我做错了什么?
首先是应用程序的一些背景。我有一个应用程序通过线程池并行处理许多独立任务。线程池现在挂起。
以下是我的线程转储中的一个片段,我在 pool-2 中的所有线程都被“pool-2-thread-78”阻塞。试图写入控制台似乎被锁定,我觉得这非常奇怪。任何人都可以为我阐明情况吗?
编辑:平台详细信息 java 版本“1.6.0_07”Java(TM) SE 运行时环境(构建 1.6.0_07-b06)Java HotSpot(TM) 客户端 VM(构建 10.0-b23,混合模式,共享)
Ubuntu Linux 服务器双四核机器。
它似乎在写入打印流时被锁定,我考虑过只删除控制台附加程序,但是我宁愿知道它为什么会阻塞并根据这些知识将其删除。在过去,删除并查看它是否有效又回来咬我:)
我的 log4j 中的相关部分
log4j.rootLogger=调试,STDOUT log4j.logger.com.blah=INFO,LOG log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.LOG=org.apache.log4j.FileAppender
线程转储提取
"pool-2-thread-79" Id=149 在 org.apache.log4j.spi.RootLogger@6c3ba437 上被阻塞,由 org.apache.log4j.Category.callAppenders 上的 "pool-2-thread-78" Id=148 拥有( Category.java:201) 在 org.apache.log4j.Category.forcedLog(Category.java:388) 在 org.apache.log4j.Category.error(Category.java:302) 在 com.blah.MessageProcessTask.run(MessageProcessTask .java:103) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask/java:268) 在 java.util.concurrent 的 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)。 FutureTask.run(FutureTask/java:54) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java .lang.Thread.run(Thread.java:619)
"pool-2-thread-78" Id=148 在 java.io.FileOutputStream.write(FileOutputStream.java:260) 在 java.io.FileOutputStream.writeBytes(Native Method) 在 java.io.BufferedOutputStream.write(BufferedOutputStream) 可运行.java:105) - 在 java.io.PrintStream.write(PrintStream.java:430) 处锁定 <0x6f314ba4> (a java.io.BufferedOutputStream) - 在 org.apache 处锁定 <0xd5d3504> (a java.io.PrintStream) .log4j.ConsoleAppender$SystemOutStream.write(ConsoleAppender.java:173) 在 sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) 在 sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) 在sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276) 在 sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122) - 在 java 锁定 <0x6243a076> (a java.io.OutputStreamWriter)。io.OutputStreamWriter.flush(OutputStreamWriter.java:212) at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:57) at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:315) at org org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:230) 处的 .apache.log4j.WriterAppender.append(WriterAppender.java:159) - 锁定 <0x45dbd560>(org.apache.log4j.ConsoleAppender)在 org. org.apache.log4j.Category.callAppenders(Category.java:203) 处的 apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:65) - 锁定 <0x6c3ba437> (一个 org.apache.log4j.spi.RootLogger)在 org.apache.log4j.Category.forcedLog(Category.java:388) 在 org.apache.log4j.Category.error(Category.java:302) 在 com.blah.MessageProcessTask.run(MessageProcessTask.java:103) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask/java:268) 在 java.util.concurrent.FutureTask.run (FutureTask/java:54) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 在 java.lang。线程运行(线程.java:619)第907章)第907章)
c# - 监视器类的 C# 多线程问题 - 可能的生命锁?
我有一些代码,我无法正确理解。问题是程序是多线程的,其中有一些代码应该同步,所以我写了这个:
我遇到的问题是,在某个时间点,所有线程似乎都在睡觉——有人能说出原因吗?该程序一直在无休止地运行,几乎没有消耗cpu,但没有完成任何工作——在跟踪程序时,我发现在某些时候没有线程处于活动状态,但其中很多都在休眠。我知道大部分错误(如果是开发人员 - 总是)位于显示器前面 0.5m 处 - 但我自己无法弄清楚......也许在几分钟内;)
有人可以向我解释一下 - 在此先感谢。
mysql - 如何检测 Mysql / innodb 中的死锁?
我知道在 Innodb 中使用事务时不可避免地会发生死锁,并且如果应用程序代码正确处理它们是无害的 - 正如手册所说,“再试一次”。
所以我想知道 - 你如何检测死锁?死锁是否会发出一些特殊的 mysql 错误号?如果这很重要,我正在使用 PHP 的 mysqli 扩展。
谢谢你。
编辑:找到解决方案,见评论