什么是条件同步?

Goo*_*ber 5 c# synchronization conditional-statements

有人可以向我解释条件同步吗?

一个例子(最好是在C#中)也将非常受欢迎.

Rob*_*vey 9

听起来你的教授正在谈论线程.线程使计算机程序一次可以执行多项操作.在一个已经运行的情况下启动新线程的行为被计算机程序员称为"旋转线程".

线程可以共享相同的内存空间.条件同步(或仅仅是同步)是保护内存区域不被同时由两个不同线程修改的任何机制.

假设你在外面购物,妻子在家里付账单.这是一个天真的例子,它在现实生活中并没有真正起作用,但它将作为一个简单的例子.

你的妻子正在网上支付账单.与此同时,您正在杂货店刷信用卡.这两种行为都涉及将钱从支票账户中转出.要模拟此活动,我们编写以下代码:

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
        Console.Writeline("Your Debit is:       " + debitAmount.ToString());
        myAccountBalance = myAccountBalance - amount;
        Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

假设,您的妻子在一个线程上运行此类的一个实例("复制"),您正在另一个线程上运行实例.myAccountBalance变量被声明为static,以允许它在两个正在运行的实例之间共享(您和您的妻子只有一个支票帐户).

您可以通过调用以下代码来进行借记:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(100);
Run Code Online (Sandbox Code Playgroud)

你的妻子在同一时间扣款:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(50);
Run Code Online (Sandbox Code Playgroud)

如果您的妻子的线程在屏幕上打印旧余额后,但在打印新余额之前,您的线程会被中断?你妻子的帖子借记帐户并将控制权返还给你的帖子.你的妻子在屏幕上看到了这个:

Your Old Balance is: 2000
Your Debit is:       50
Your New Balance Is: 1950
Run Code Online (Sandbox Code Playgroud)

当计算机在屏幕上打印新余额时,这将是错误的,因为您的妻子的借记也将被计算在内.你会看到这样的东西:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1850
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,我们使用lock语句包含方法代码.lock语句导致所有其他线程等待我们的实例完成.新代码如下所示:

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        lock (this)
        {
            Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
            Console.Writeline("Your Debit is:       " + debitAmount.ToString());
            myAccountBalance = myAccountBalance - amount;
            Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在您妻子的代码开始执行之前,您妻子的线程现在将等待锁定语句中的代码完成执行.您的新余额现在是正确的,因为在您完成交易时,您妻子的线程不再可能更改余额.在屏幕上,您现在将看到:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1900
Run Code Online (Sandbox Code Playgroud)

你的妻子会看到这个:

Your Old Balance is: 1900
Your Debit is:       50
Your New Balance Is: 1850
Run Code Online (Sandbox Code Playgroud)

这是同步.