как потоки общаются друг с другом?

как потоки общаются друг с другом? они не используют значения друг друга, затем каков способ коммуникации между ними?

7
задан Jon Hanna 13 August 2010 в 16:21
поделиться

3 ответа

Существует несколько способов взаимодействия потоков друг с другом. Этот список не является исчерпывающим, но в него включены наиболее часто используемые стратегии.

  • Общая память, такая как переменная или какая-то другая структура данных
  • Примитивы синхронизации, такие как блокировки и семпахоры
  • События, такие как ManualResetEvent или AutoResetEvent

Общая память

public static void Main()
{
  string text = "Hello World";
  var thread = new Thread(
    () =>
    {
      Console.WriteLine(text); // variable read by worker thread
    });
  thread.Start();
  Console.WriteLine(text); // variable read by main thread
}

Примитивы синхронизации

public static void Main()
{
  var lockObj = new Object();
  int x = 0;
  var thread = new Thread(
    () =>
    {
      while (true)
      {
        lock (lockObj) // blocks until main thread releases the lock
        {
          x++;
        }
      }
    });
  thread.Start();
  while (true)
  {
    lock (lockObj) // blocks until worker thread releases the lock
    {
      x++;
      Console.WriteLine(x);
    }
  }
}

События

public static void Main()
{
  var are = new AutoResetEvent(false);
  var thread = new Thread(
    () =>
    {
      while (true)
      {
        Thread.Sleep(1000);
        are.Set(); // worker thread signals the event
      }
    });
  thread.Start();
  while (are.WaitOne()) // main thread waits for the event to be signaled
  {
    Console.WriteLine(DateTime.Now);
  }
}
5
ответ дан 7 December 2019 в 01:14
поделиться

«они не используют значения друг друга» - ну, два потока в одном процессе могут видеть общие переменные, так что это простая оценка. Итак, мы используем различные синхронизацию, блокировку, мутации и семпахоры для ожидания условий и пробуждения ожидающих потоков.

В Java вы используете различные примитивы, такие как синхронизация. Вы можете прочитать это руководство

4
ответ дан 7 December 2019 в 01:14
поделиться

Потоки могут обмениваться значениями, им просто нужно быть осторожными при этом. В .Net наиболее распространенными методами являются оператор lock и класс Interlocked.

1
ответ дан 7 December 2019 в 01:14
поделиться