Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 同步线程:这里有冲突吗?_C#_Multithreading_Synchronization - Fatal编程技术网

C# 同步线程:这里有冲突吗?

C# 同步线程:这里有冲突吗?,c#,multithreading,synchronization,C#,Multithreading,Synchronization,为什么这个代码有效?ProcessWorkItems静态方法锁定ConsoleGate对象,跟踪也执行相同的操作。我以为这个东西只能锁一次。?一些解释?C#中的锁是可重入的-单个线程可以多次获得相同的锁而不会阻塞。因为这里只有一个线程,所以没有问题-锁用于跨多个线程同步对资源的访问 从锁上的按钮: lock关键字确保一个线程不会进入关键线程 代码段,而另一个线程位于关键段。如果 另一个线程尝试输入锁定的代码,它将等待、阻止、, 直到对象被释放 有关重入锁定的更多信息,请参见此SO线程:C#中的锁

为什么这个代码有效?ProcessWorkItems静态方法锁定ConsoleGate对象,跟踪也执行相同的操作。我以为这个东西只能锁一次。?一些解释?

C#中的锁是可重入的-单个线程可以多次获得相同的锁而不会阻塞。因为这里只有一个线程,所以没有问题-锁用于跨多个线程同步对资源的访问

从锁上的
按钮

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

有关重入锁定的更多信息,请参见此SO线程:

C#中的锁是重入的-单个线程可以多次获取相同的锁而不阻塞。因为这里只有一个线程,所以没有问题-锁用于跨多个线程同步对资源的访问

从锁上的
按钮

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


有关重入锁定的更多信息,请参阅此SO线程:

此处显示的所有代码都在同一线程上运行。这就是为什么它会像没有使用“lock”时一样运行的原因。

这里显示的所有代码都在同一个线程上运行。这就是为什么它会像没有使用“锁”时一样运行

class Class1
    {
        private static object consoleGate = new Object();

        private static void Trace(string msg)
        {
            lock (consoleGate)
            {
                Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId,
                    Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore",
                    DateTime.Now.ToString("HH:mm:ss.ffff"), msg);
            }
        }
        private static void ProcessWorkItems()
        {
                    lock (consoleGate)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            Trace("Processing " + i);
                            Thread.Sleep(250);
                        }
                    }
            Console.WriteLine("Terminado.");

        }
        static void Main()
        {
            ProcessWorkItems(); Console.ReadLine();
        }
    }
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Terminated