Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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# Join()和Lock()之间的根本区别_C#_Multithreading - Fatal编程技术网

C# Join()和Lock()之间的根本区别

C# Join()和Lock()之间的根本区别,c#,multithreading,C#,Multithreading,对于Join()和lock()两种情况,一个线程可以依次执行。主要区别是什么?lock是一个监视器,用于确保一次只能执行一个线程 lock(myobj) { // only 1 thread here } Join用于等待线程完成,然后再继续执行 anotherThread.Join(); // execution here only when anotherThread is complete Thread.Join()等待线程退出Monitor.Enter(obj)(编译器如何将条

对于Join()和lock()两种情况,一个线程可以依次执行。主要区别是什么?

lock是一个监视器,用于确保一次只能执行一个线程

lock(myobj)
{
   // only 1 thread here
}
Join用于等待线程完成,然后再继续执行

anotherThread.Join();
// execution here only when anotherThread is complete
Thread.Join()
等待线程退出
Monitor.Enter(obj)
(编译器如何将条目表示为
lock
语句)不等待其他线程持有
obj
的对象锁


前者用于帮助管理线程生存期,后者用于控制并发性。

在下面的代码中,第二个线程等待第一个线程退出。因此,第一个线程开始并在第二个线程开始之前完成

public void threadExample1()
{
    Thread t1=new Thread(fun1);
    Thread t2=new Thread(fun2);

    t1.Start();
    t1.Join();

    t2.Start();
}
在第二个示例中,我们不知道哪个线程将首先启动,但我们知道由于
lock

public readonly object locker = new object();
public void threadExample2()
{
   Thread t1=new Thread(fun1);
   Thread t2=new Thread(fun2);

   t1.Start();
   t2.Start();
}

public void fun1()
{ 
   lock(locker)
   {
       for (int i = 0; i < 10; i++)
         Console.Write("1");
   }
}
public void fun2()
{ 
   lock(locker)
   {
       for (int i = 0; i < 10; i++)
         Console.Write("2");
   }
}
public readonly object locker=new object();
public void threadExample2()
{
螺纹t1=新螺纹(fun1);
螺纹t2=新螺纹(fun2);
t1.Start();
t2.Start();
}
公共图书馆1(
{ 
锁(储物柜)
{
对于(int i=0;i<10;i++)
控制台。写入(“1”);
}
}
公共图书馆2(
{ 
锁(储物柜)
{
对于(int i=0;i<10;i++)
控制台。写入(“2”);
}
}
输出将是“1111111222222”或“2222222211111111111111”作为锁示例,而只有“11111111112222222”作为连接示例