如何在无限循环中使用线程锁?

时间:2016-03-07 20:27:45

标签: c# multithreading thread-safety

我对一般的线程很新,我想在C#中尝试它。我试图对每秒钟衰减并且每10秒重新填充一次的吨位进行基本模拟。从我读到的,线程安全是我需要考虑的事情,因为有两个线程;一个用于将变量吨位减少160,一个用于向吨位添加随机量,并且因为它们正在对变量吨位进行交易,我应该确保它们被正确访问。

我读过如何使用 lock(object),我理解简单线程示例的概念,但我如何将它用于永久运行的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);
            }
        }
    }

1 个答案:

答案 0 :(得分:5)

您希望锁定尽可能小,只有在与共享对象交互的行周围,而不是整个循环。另外,将//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); } } 放在while循环is a bad habit to have中,您应该只生成一个随机实例并在循环之外初始化它。

Sleep

另外,我假设您正在为某种赋值执行此操作并且必须使用线程,但是如果我真的这样做,我将不会使用带有循环的线程+ %f而是使用两个定时器,每20秒发射一次,每10秒发射一次。根据{{​​3}},您可能或可能仍然不需要使用锁。

相关问题