Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “a”的确切含义是什么;锁;锁_C#_Multithreading_Locking - Fatal编程技术网

C# “a”的确切含义是什么;锁;锁

C# “a”的确切含义是什么;锁;锁,c#,multithreading,locking,C#,Multithreading,Locking,我正在开发一个类,它创建和管理多个套接字连接,并将从套接字接收到的信息转发到主线程,反之亦然。我在多线程中传入和传出如此多的信息对我来说是新的(就像C#中的大多数东西一样),所以我需要澄清一下锁的确切功能 当我锁定一个方法的一部分时,它是否只确保没有其他线程可以进入该部分代码,或者它实际上是否阻止该部分代码中的所有变量被其他线程修改,无论它们发生在何处 例如: public class TestLock { public volatile int a = 0; public vo

我正在开发一个类,它创建和管理多个套接字连接,并将从套接字接收到的信息转发到主线程,反之亦然。我在多线程中传入和传出如此多的信息对我来说是新的(就像C#中的大多数东西一样),所以我需要澄清一下
锁的确切功能

当我锁定一个方法的一部分时,它是否只确保没有其他线程可以进入该部分代码,或者它实际上是否阻止该部分代码中的所有变量被其他线程修改,无论它们发生在何处

例如:

public class TestLock
{
    public volatile int a = 0;
    public volatile int b = 2;
    private object ALock = new Object();

    public TestLock() { }

    public void UnlockEdit(int atemp, int btemp)
    {
        a = atemp;
        b = btemp;
    }

    public void LockedEdit(int atemp, int btemp)
    {


        lock(ALock)
        {
            a = atemp;
            b = btemp;
        }
    }

    public int[] ReturnValues()
    {
        int[] ret = new int[2];

        lock (ALock)
        {
            ret[0] = a;
            ret[1] = b;
        }

        return ret;
    }

}
如果线程A调用
LockedEdit
方法,并在线程B进入
unlockededit
之前到达锁。会发生什么?锁是否会阻止线程B修改
a
B
?它会阻挡吗?或者锁只适用于一个特定的代码分支?或者我应该对我要修改的对象的每个读写方法应用相同的
lock
对象(
ALock
),并从多个线程读取对象?

该语句在代码中创建一个。这将防止其他线程在lock语句括号内输入代码。其他线程基本上等待轮到它们进入该部分

它不阻止其他线程修改类中的变量。例如,TestLock.a和TestLock.b可以由TestLock类中不使用Lock(ALock)语句的函数修改。此外,由于变量a和b是公共的,它们可以由类外的代码(在单独的线程上)修改

下面是到.NET的一个很好的链接:

从MSDN:

lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于关键部分。如果另一个线程试图输入锁定的代码,它将等待、阻塞,直到对象被释放

以下是一些代码的示例,这些代码可确保多线程应用程序的变量安全(摘自):


你可以像在这里一样锁定这个物体

lock(ALock)
代码的这一部分现在被这个对象锁定,在释放锁之前,没有其他对象可以进入,也就是说,这个对象离开关键部分

这也意味着,在这段时间内,没有其他对象能够修改该对象在关键部分锁定的变量

当我锁定一个方法的一部分时,它是否只确保没有其他线程可以进入该部分代码,或者它实际上是否阻止该部分代码中的所有变量被其他线程修改,无论它们发生在何处

这个问题太复杂,形式不正确,无法回答。让我们重写一下

当我锁定方法的一部分时,它是否确保没有其他线程可以进入该部分代码

对。然而,更准确的说法是:在获得与
lock
语句中给定的“monitor”对象相关联的锁之前,无法进入锁定部分。一次只能通过一个线程获得该锁

我还注意到,在涉及监视器更高级用途(如脉冲)的场景中,如何获得锁还有一些微妙之处。同样,请仔细阅读文档,了解监视器操作的确切语义描述

当我锁定方法的一部分时,它是否只确保没有其他线程可以进入该部分代码

不。锁有其他作用,而不仅仅是确保在一个街区上相互排斥。例如,它引入了一个内存屏障

它是否真的阻止了该代码段中的所有变量被其他线程修改,无论它们发生在何处

当然不是

锁是否会阻止线程B修改a和B

你建了一个浴室,门的一侧有一把锁,另一侧对外开放。你锁上浴室的门。这似乎是确保一次只能挤一个人牙膏的有效方法吗

它会阻挡吗

你要哪个街区

锁是否只适用于一个特定的代码分支

我搞不懂这个问题

对于要修改的对象和从多个线程读取的对象,我是否应该对每个读写方法应用相同的“锁定”对象(ALock)

您没有问但应该问的问题:

我应该首先使用共享内存多线程吗


可能不会。即使是专家也很难做出正确的判断。如果我在做套接字编程,我会从使用async await或任务并行库来管理异步开始,而不是直接参与线程。线程是专为专家设计的低级工具;尝试将抽象级别提高几个级别。

如果我在两个不同的锁中使用相同的“对象”(如上面代码中的“ALock”),一次是否只有一个锁处于活动状态?即,如果线程A已在“LockedEdit”中输入锁,线程B调用“ReturnValues”线程B会等待线程A的锁释放吗?是的,线程B会等待线程A的锁从LockedEdit退出非常感谢-这几乎是我没有建立的连接,因为我试图弄清楚如果一次只能锁定一个方法进行修改,我将如何修改和/或以不同的方式读取同一对象对不起,我的意思是“它只是阻止它进入代码的那一部分吗?”例如,同一个锁定“对象”被用于两个锁。我确实读过文档,或者我在这里有比目前更多的问题-有时候文档对我来说有点不清楚。我真的不知道第一个问题是什么让人困惑。虽然我想代词“他们”的意思是“变量”
lock(ALock)