我对线程一般都比较陌生,我想在C#中尝试一下。我正在试图对每20秒钟衰减一次并每10秒重新充满一次的吨位进行基本模拟。从我读的内容来看,线程安全是我需要考虑的事情,因为有两个线程;一个用于将可变吨位衰减160,另一个用于对吨位增加一个随机数并且由于他们正在对变量吨位进行交易,所以我应该确保它们的访问是正确的。如何在无限循环中使用线程锁?
我读到如何使用锁(对象),我理解简单线程示例的概念,但是如何将它用于永久运行的2个线程并且必须及时调整吨位?
这是我的,但是当我锁定整个循环,其他线程永远不会产生。或者我有错误的代码结构?
public double tonnage = 1000;
private object x = new object();
//Starts the simulation, runs forever until user ends the simulation
private void btnStart_Click(object sender, EventArgs e)
{
//Decay Tonnage
Thread decayTonnageThread = new Thread(() => decayTonnage (tonnage));
decayTonnageThread .Start();
//Add Tonnage
Thread addTonnageThread = new Thread(() => addTonnage (tonnage));
addTonnageThread .Start();
}
//I want to decay the tonnage every 20 seconds
public void decayTonnage (double tonnage)
{
lock(x)
{
while (true)
{
tonnage = tonnage - 160;
Thread.Sleep(20000);
}
}
}
//Add to the tonnage every 10 seconds
public void addTonnage (double tonnage)
{
lock(x)
{
while (true)
{
Random random = new Random();
double randomNumber = random.Next(97, 102);
tonnage = tonnage + randomNumber;
Thread.Sleep(10000);
}
}
}
你会想要在循环内部进行锁定,而不是在外部。 – adv12
仅在更改吨位时使用锁定,排除其余代码。也许使用[Interlocked类](https://msdn.microsoft.com/nl-nl/library/system.threading.interlocked(v = vs.110).aspx)可能是一个好主意 –
@ adv12它工作谢谢! –