Принципиальная разница между Join () Lock ()

В случае как Join (), так и lock () один поток может выполняться после другого. В чем главное отличие?

13.10.2009 09:00:32
3 ОТВЕТА

Блокировка - это монитор, который используется для гарантии того, что одновременно может выполняться только 1 поток.

lock(myobj)
{
   // only 1 thread here
}

Присоединение используется для ожидания завершения потока до продолжения выполнения.

anotherThread.Join();
// execution here only when anotherThread is complete
10
13.10.2009 09:03:12

Thread.Join()ждет выхода потока . Monitor.Enter(obj)(как компилятор выражает запись в lockвыражении) не ждет, пока другой поток не удержит objблокировку объекта.

Первый используется для управления временем жизни потока, второй - для управления параллелизмом.

3
13.10.2009 09:04:10

В приведенном ниже коде второй поток ожидает выхода первого потока. Итак, первый поток запускается и завершается до запуска второго потока.

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");
   }
}

вывод будет либо «11111111112222222222», либо «22222222221111111111» для примера блокировки, в то время как только «11111111112222222222» для примера соединения

2
2.05.2015 04:38:43