- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
我在我的一段代码中遇到了死锁问题。值得庆幸的是,我已经能够在下面的示例中重现该问题。作为普通的 .Net Core 2.0 控制台应用程序运行。
class Class2
{
static void Main(string[] args)
{
Task.Run(MainAsync);
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static async Task MainAsync()
{
await StartAsync();
//await Task.Delay(1); //a little delay makes it working
Stop();
}
static async Task StartAsync()
{
var tcs = new TaskCompletionSource<object>();
StartCore(tcs);
await tcs.Task;
}
static void StartCore(TaskCompletionSource<object> tcs)
{
_cts = new CancellationTokenSource();
_thread = new Thread(Worker);
_thread.Start(tcs);
}
static Thread _thread;
static CancellationTokenSource _cts;
static void Worker(object state)
{
Console.WriteLine("entering worker");
Thread.Sleep(100); //some work
var tcs = (TaskCompletionSource<object>)state;
tcs.SetResult(null);
Console.WriteLine("entering loop");
while (_cts.IsCancellationRequested == false)
{
Thread.Sleep(100); //some work
}
Console.WriteLine("exiting worker");
}
static void Stop()
{
Console.WriteLine("entering stop");
_cts.Cancel();
_thread.Join();
Console.WriteLine("exiting stop");
}
}
我期望的是完整的序列如下:
Press any key...
entering worker
entering loop
entering stop
exiting worker
exiting stop
但是,实际序列在 Thread.Join
调用时停止:
Press any key...
entering worker
entering stop
最后,如果我在 MainAsync
主体中插入一个小的延迟,一切都会顺利进行。为什么(在哪里)发生死锁?
注意:在原始代码中,我使用 SemaphoreSlim
而不是 TaskCompletionSource
解决了问题,完全没有问题。我只想了解问题出在哪里。
我正在使用 channel 在 Go 中构建一个异步 Btree,但我收到错误 fatal error: all goroutines are asleep - deadlock! 我不知道为什么因为
我正在尝试从字符串线程中明智地读取单词。意味着一个线程读一个单词,当所有单词完成后,所有线程也应该和平退出。在此示例中,字符串中有11个单词,并且有4个线程对该字符串进行操作。但是该程序在运行时被挂起
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
我想使用 C# 自动化第三方 Windows 命令行程序。通常,它是一个交互式控制台,您发送命令,它可能会提示详细信息,发回结果并显示提示以询问更多命令。通常: c:\>console_access.
似乎“复杂”(getC)功能被阻止了。我假设 channel 一旦被读取就会被销毁,因此我想知道如何与 getC 函数和 main 共享 sC channel 函数不会陷入死锁(current sni
我想编写三个相互发送整数的并发 go 例程。现在,我的代码已正确编译,但在第一次执行后出现错误“抛出:所有 goroutines 都睡着了 - 死锁!”。我试图找到错误,但我无法在代码逻辑中找到任何错
这是我的代码,我哪里出错了? func main() { intChan := make(chan int) wg := sync.WaitGroup{} for i := 0;i<5;i
package main import ( "fmt" "runtime" "sync" "time" ) func main() { intInputChan
我是一名优秀的程序员,十分优秀!