zoukankan      html  css  js  c++  java
  • (C#) Lock

    C# Lock

    原文:http://www.dotnetperls.com/lock

    Locking is essential in threaded programs. It restricts code from being executed by more than one thread at the same time. This makes threaded programs reliable. The lockstatement uses a special syntax form to restrict concurrent access.

    Keywords

    Note:Lock is compiled into a lower-level implementation based on threading primitives.

    Example

    Here we see a static method "A" that uses the lock statement on an object. When the method A is called many times on new threads, each invocation of the method accesses the threading primitives implemented by the lock.

    Then:Only one method A can call the statements protected by the lock at a single time, regardless of the thread count.

    Program that uses lock statement: C#
    
    using System;
    using System.Threading;
    
    class Program
    {
        static readonly object _object = new object();
    
        static void A()
        {
    	// Lock on the readonly object.
    	// ... Inside the lock, sleep for 100 milliseconds.
    	// ... This is thread serialization.
    	lock (_object)
    	{
    	    Thread.Sleep(100);
    	    Console.WriteLine(Environment.TickCount);
    	}
        }
    
        static void Main()
        {
    	// Create ten new threads.
    	for (int i = 0; i < 10; i++)
    	{
    	    ThreadStart start = new ThreadStart(A);
    	    new Thread(start).Start();
    	}
        }
    }
    
    Possible output of the program
    
    28106840
    28106949
    28107043
    28107136
    28107246
    28107339
    28107448
    28107542
    28107636
    28107745

    In this example, the Main method creates ten new threads, and then calls Start on each one. The method A is invoked ten times, but the tick count shows the protected method region is executed sequentially—about 100 milliseconds apart.

    Note:If you remove the lock statement, the methods will be executed all at once, with no synchronization.

    Intermediate representation

    Let's examine the intermediate representation for the lock statement in the above example method A. In compiler theory, high-level source texts are translated to lower-level streams of instructions.

    Tip:The lock statement here is transformed into calls to the static methods Monitor.Enter and Monitor.Exit.

    Also:The lock is actually implemented with a try-finally construct. This uses the exception handling control flow.

    Intermediate representation for method using lock
    
    .method private hidebysig static void A() cil managed
    {
        .maxstack 2
        .locals init (
    	[0] object obj2)
        L_0000: ldsfld object Program::_object
        L_0005: dup
        L_0006: stloc.0
        L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
        L_000c: ldc.i4.s 100
        L_000e: call void [mscorlib]System.Threading.Thread::Sleep(int32)
        L_0013: call int32 [mscorlib]System.Environment::get_TickCount()
        L_0018: call void [mscorlib]System.Console::WriteLine(int32)
        L_001d: leave.s L_0026
        L_001f: ldloc.0
        L_0020: call void [mscorlib]System.Threading.Monitor::Exit(object)
        L_0025: endfinally
        L_0026: ret
        .try L_000c to L_001f finally handler L_001f to L_0026
    }

    Relativity

    By using the lock statement to synchronize accesses, we are creating a communication between time and state. The state is connected to the concept of time and sequential accesses to the lock.

    In the Theory of Relativity, there is also a communication between time and state. This is the speed of light, which is a constant based on the relation of time and space. This connection is present also in locks—in threading constructs.

    Tip:For a better description of how relativity mirrors concurrent synchronization, please see the wizard book.

    Summary

    We examined the lock statement in the C# language, first seeing its usage in an example program, and then describing this synchronization. Next, we stepped into the intermediate representation and its meaning in compiler theory.

    Finally:We related the Theory of Relativity and the complexities of the physical universe to the lock statement.

  • 相关阅读:
    .NET中常用获取程序根目录的方法
    多态的实现
    9个优秀网上免费标签云生成工具
    Asp.Net自定义错误页心得介绍
    C# string.Format 格式化使用说明
    接口编程,反射创建对象
    DllImport使用的一点整理
    System.Data.ConstraintException: 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
    C# OleDb读取Excel文件 避免出现 科学计数法 的列
    C++翻译C#
  • 原文地址:https://www.cnblogs.com/fdyang/p/4088904.html
Copyright © 2011-2022 走看看