i_s*_*tos 2 c# multithreading thread-safety
我对一般的线程很新,我想在C#中尝试它.我试图对每秒钟衰减并且每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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您希望锁定尽可能小,只有在与共享对象交互的行周围,而不是整个循环.另外,放入Random random = new Random();
while循环是一个坏习惯,你应该只做一个随机实例并在循环之外初始化它.
//I want to decay the tonnage every 20 seconds
public void decayTonnage (double tonnage)
{
while (true)
{
lock(x)
{
tonnage = tonnage - 160;
}
Thread.Sleep(20000);
}
}
//Add to the tonnage every 10 seconds
public void addTonnage (double tonnage)
{
Random random = new Random();
while (true)
{
double randomNumber = random.Next(97, 102);
lock(x)
{
tonnage = tonnage + randomNumber;
}
Thread.Sleep(10000);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我假设您正在为某种分配执行此操作,并且必须使用线程,但如果我真的这样做,我将不会使用带有循环+ a的线程,Sleep
而是使用两个定时器,一个每20秒触发一次一个每10秒发射一次.根据您使用的计时器类型,您可能或可能仍然不需要使用锁.