Фундаментальные вопросы о многопоточности - PullRequest
0 голосов
/ 18 марта 2020

Мне было бы любопытно, если это разрешить синтаксис, и если это именно то, что он делает:

public void startThreads(string userIp){
     user1 = new TCPListener("0.0.0.0", 1111);
     tmpThread = new Thread(new ThreadStart(() => User1Listern(user1);
     tmpThread.Start();

     user2 = new TCPListener("0.0.0.0", 1112);
     tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);
     tmpThread.Start();

     user3 = new TCPListener("0.0.0.0", 1113);
     tmpThread = new Thread(new ThreadStart(() => User3Listern(user3);
     tmpThread.Start();
}

public void User3Listern(TCPListener tmp){
    tcpLister = (TCPListener)tmp;
    user3.Start(); //Start User3 
    Thread.Sleep(1000);
    //MS documenation
    while(true){
        user3 = this.tcpListener.AccepTcpClient();
        Thread User3Start = new Thread(new ParamertizedThreadStart(User3Profile));
        User3Start.Start(user3);
    }    
}

Мои вопросы:

  • Может ли поток содержать несколько таких потоков? (tmpThread)
  • что произойдет, если вы не присоединитесь к ним, вы просто «запустите» их.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

может ли поток содержать несколько подобных потоков?

Это не то, что происходит. Эти темы никак не связаны между собой. Каждый из них создается и запускается по одному.

Когда вы делаете это:

tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);

Новый поток не имеет ничего общего с предыдущим потоком. То, что здесь происходит, даже не имеет ничего общего с потоками, то же самое будет верно для любого объекта.

Создается новый объект, и переменная теперь указывает на этот новый объект вместо старого один. Старый еще существует. Если ничто не использует старый объект, то он может быть доступен для сбора мусора под капотом. Но это не тот случай, старый объект все еще находится в памяти и все еще выполняет свою функцию потока. Переменная теперь просто указывает на новый объект.

Если в конце этого метода вы изучите содержимое tmpThread, вы обнаружите, что он ссылается только на последний Thread объект, который был создан. Этот метод больше не имеет ссылок на первые два объекта.

1 голос
/ 18 марта 2020

Позвольте мне начать с пары фундаментальных понятий, которые вы пропустили:

  • Код, который вы разместили, устарел по текущему стандарту C#. Net, больше не является Thread API используется, как вы опубликовали, на данный момент все делается с помощью Parallel API, который внутренне использует Threadpool

Что такое потоки?

  • Windows - это многопоточная ОС, в отличие от Linux, которая является многопроцессорной, в общем случае потоки представляют собой не что иное, как простой набор инструкций выполнения.
  • В многоядерном В системе может быть выполнено несколько таких инструкций для каждого ядра, таким образом, несколько потоков / процессов.
  • Таким образом, поток - это не что иное, как логическая единица и легкий контекст выполнения
  • Теперь каждый процесс в windows имеет Main поток, и он также может вызывать другие потоки (фоновые потоки или потоки пула потоков) для выполнения других задач в фоновом режиме, который имеет многократное использование, например ускорение обработки (параллелизм - Связанный с CPU / IO)
  • Основной поток является основным потоком, а потоки пула всегда являются фоновыми. Фоновые потоки не могут существовать без основного / основного потока, поскольку процесс, выполняющий его, будет go отключен с основным потоком.

Теперь ваш код и что он делает?

  • Вы инициируете три фоновых потока, где вы предоставляете делегата, как и ожидалось конструктором.
  • Как и в случае с третьим потоком, вы, вероятно, передаете TCPListener каждому потоку для прослушивания входящего запроса TCP.
  • Все потоки инициируются в главном потоке, и они начинают выполняться в background

Мой вопрос: может ли тема содержать несколько таких потоков? (tmpThread)?

  • Как я пояснил, это не один поток, содержащий несколько потоков, а только то, что фоновые потоки выполняются при вызове метода start при вызове основным потоком, а затем управление возвращается к основному потоку, в то время как фоновые потоки завершают свои задачи sh в фоновом режиме.

что происходит, если вы этого не сделаете «Присоединяйся» к ним, ты просто «запускаешь» их.

  • Join - это указание основному потоку дождаться завершения основного потока до конца sh перед выходом, если соединение не вызывается, то основной поток может завершиться, если ему нечего обрабатывать, таким образом, процесс завершится sh, а фоновый поток будет похож на зомби, и результат через них невозможен. Хотя в основном это происходит в том случае, если фоновый поток выполняет какое-то задание в памяти, давайте предположим, что он сделал вызов БД, тогда это будет go до конца, но никакого результата не будет возвращаться, если ожидается, так как нет потока, доступного для их получения.

Дополнительная информация

  • Глядя на ваш код Thread3, где у вас бесконечный l oop, он может перегружайте систему, помните, что потоки являются дорогостоящим ресурсом
  • Использование пула потоков через Parallel API значительно улучшает оптимизацию, никогда не приводит к перегрузке и не перегружает систему
  • Проблема только с несколькими потоками состояние гонки и взаимоблокировки, для которых доступны различные контексты синхронизации, такие как блокировка, семафор
  • Для многопоточного проектирования параллельные коллекции являются лучшим выбором

Редактировать 1

Просмотрите реализацию TCP-сервера на fiddle , я использовал ссылку из следующая ссылка .

Что содержит реализация:

  1. Асин c Реализован TCP-сервер, который ожидает в фоновом режиме чтобы получить I / p
  2. Как только вход получен, он обрабатывается, как показано в методе DoSomethingWithClientAsync()
  3. Поскольку реализация выполняется в Asyn c, вы можете запустить тысячи TCP-серверов без какого-либо влияния на систему, так как нет фоновой блокировки потоков
  4. Основной поток будет ожидать завершения фонового процесса
  5. Каждый сервер должен запускаться с уникального порта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...