gpt4 book ai didi

c# - 我怎样才能成为线程安全的?

转载 作者:行者123 更新时间:2023-11-30 17:30:40 25 4
gpt4 key购买 nike

我正在查看一个应用程序,我将在其中处理多个集成并需要它们在线程中运行。我需要线程“向母舰(又名主循环)报告”。片段:

class App
{
public delegate void StopHandler();
public event StopHandler OnStop;

private bool keepAlive = true;

public App()
{
OnStop += (() => { keepAlive = false; });

new Thread(() => CheckForStop()).Start();
new Thread(() => Update()).Start();

while (keepAlive) { }
}

private void CheckForStop()
{
while (keepAlive) if (Console.ReadKey().Key.Equals(ConsoleKey.Enter)) OnStop();
}

private void Update()
{
int counter = 0;

while (keepAlive)
{
counter++;

Console.WriteLine(string.Format("[{0}] Update #{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), counter));

Thread.Sleep(3000);
}
}
}

这里的问题是变量keepAlive。通过使用它不是线程安全的。我的问题是如何让它成为线程安全的。

如果 Update 使用 while(true) 而不是 keepAlive 和事件 OnStop,它会变得安全吗(r) > 中止了线程?

最佳答案

使用对象和lock it

class App
{
public delegate void StopHandler();
public event StopHandler OnStop;
private object keepAliveLock = new object();
private bool keepAlive = true;

....
private void Update()
{
int counter = 0;

while (true)
{
lock(keepAliveLock)
{
if(!keepAlive)
break;
}
counter++;

Console.WriteLine(string.Format("[{0}] Update #{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), counter));

Thread.Sleep(3000);
}
}
}

请注意,每次对 keepAlive 的访问都需要锁定(用 lock 语句包围)。注意死锁情况。

关于c# - 我怎样才能成为线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com