C# 关于多线程的基本问题

C# 关于多线程的基本问题,c#,multithreading,tcp,C#,Multithreading,Tcp,我很好奇这是否是allow语法,以及它到底是做什么的: 我的问题: 一个线程可以包含多个这样的线程吗?(tmpThread) 如果你不“加入”这些,你只是“开始”它们 一个线程可以包含多个这样的线程吗 事实并非如此。这些线程没有以任何方式“连接”。每一个都在创建和启动中,一次一个 执行此操作时: tmpThread = new Thread(new ThreadStart(() => User2Listern(user2); 新线程与前一个线程无关。这里发生的事情甚至与线程没有任何关

我很好奇这是否是allow语法,以及它到底是做什么的:

我的问题:

  • 一个线程可以包含多个这样的线程吗?(tmpThread)
  • 如果你不“加入”这些,你只是“开始”它们
一个线程可以包含多个这样的线程吗

事实并非如此。这些线程没有以任何方式“连接”。每一个都在创建和启动中,一次一个

执行此操作时:

tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);
新线程与前一个线程无关。这里发生的事情甚至与线程没有任何关系,对于任何对象也是如此

正在创建一个新对象,变量现在指向该新对象,而不是旧对象。旧的仍然存在。如果没有任何东西在使用旧对象,那么它可以在引擎盖下进行垃圾收集。但这里的情况并非如此,旧对象仍在内存中,并且仍作为线程执行其操作。该变量现在只指向一个新对象


如果在此方法末尾检查
tmpThread
的内容,您会发现它只引用创建的最后一个
Thread
对象。此方法不再引用前两个对象。

让我从两个基本概念开始,您已经跳过了:

  • 您发布的代码在当前的C#.Net标准中已经过时,不再像您发布的那样使用线程API,到目前为止,所有工作都是使用ParallelAPI完成的,该API在内部使用Threadpool
什么是线程?

  • Windows是一个多线程的操作系统,不像Linux是多进程的,线程一般只是一组简单的执行指令
  • 在多核系统上,每个核可以执行多条这样的指令,因此多个线程/进程
  • 因此,线程只不过是逻辑单元和轻量级执行上下文
  • 现在,windows中的每个进程都有一个主线程,它还能够调用其他线程(后台线程或线程池线程)在后台执行其他任务,这有多种用途,例如加快处理速度(并行度-CPU/IO绑定)
  • 主线程是前台线程,池线程总是后台线程。后台线程不能没有主/前台线程而存在,因为执行它的进程将与主线程一起停止
现在您的代码及其作用是什么?

  • 您正在启动三个后台线程,在其中按照构造函数的预期提供委托
  • 与第三个线程一样,您可能在每个线程上传递TCPListener来侦听传入的TCP请求
  • 所有线程都在主线程上启动,并在后台开始执行
我的问题是一个线程可以包含多个这样的线程吗?(tmpThread)?

  • 正如我已经阐明的,这不是一个线程包含多个线程,而是后台线程在主线程调用
    start
    方法时执行,然后控制返回到主线程,而后台线程在后台完成任务
如果你不“加入”他们,你只是“开始”他们会发生什么。

  • Join
    指示主线程在退出前等待后台线程完成,如果未调用Join,则主线程可能退出,如果它没有任何要处理的内容,则进程将完成,而后台线程则像僵尸一样,无法通过它们获得任何结果。虽然如果后台线程正在执行一些内存中的作业,大多数情况下都是这种情况,但我们假设它进行了一个DB调用,那么这会成功,但是如果预期的话,不会返回结果,因为没有线程可以接收它们
更多信息

  • 看看你的Thread3代码,你有无限循环,它可能会压倒系统,请记住线程是昂贵的资源
  • 通过并行API使用线程池进行了更好的优化,它从不过度配置,也不会使系统负担过重
  • 多线程的唯一问题是争用条件和死锁,对于这些情况,可以使用各种同步上下文,如锁、信号量
  • 对于多线程设计,并发集合是更好的选择
编辑1

回顾上的TCP服务器实现,我使用了以下参考

实施包含哪些内容:

  • 实现了异步TCP服务器,它在后台等待接收I/p
  • 接收到输入后,将对其进行处理,如方法
    DoSomethingWithClientAsync()
  • 由于实现是异步的,您可以启动1000个TCP服务器,而不会对系统造成任何影响,因为没有后台线程阻塞
  • 主线程将等待后台进程完成
  • 每台服务器应在唯一端口启动

  • 那么每个用户线程真的应该是一个全新的线程吗?然后加入他们?回到主线程?因为我想随时听到来自任何一个国家的变化users@SetupG当前位置我不确定你在问什么。每个线程都是一个接一个地创建和启动的。创建的三个线程之间似乎没有任何关联。那么它们会在整个程序中侦听吗?如果说User1的侦听器被触发,那么user2的侦听器被触发。它如何决定执行哪一个。为什么或者为什么我不想加入它们。@SetupG:从显示的代码来看,像
    user1listen
    这样的方法以及其他方法都将为TCP进行侦听
    tmpThread = new Thread(new ThreadStart(() => User2Listern(user2);