作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看一个应用程序,我将在其中处理多个集成并需要它们在线程中运行。我需要线程“向母舰(又名主循环)报告”。片段:
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/
我是一名优秀的程序员,十分优秀!