【问题标题】:.Multithreading net - implement selected code without being interrupted by threads.Multithreading net - 在不被线程中断的情况下执行选定的代码
【发布时间】:2010-11-19 18:18:04
【问题描述】:

SO 用户,

我有 3 个线程在任何给定时间同时运行,问题是在线程 1 尝试通过将用户名传递给它来连接到服务器之后,线程 2 正在被调用,并且当它的线程 1 轮到服务器关闭它的连接时代码。

有没有什么地方可以实现同时发送用户名和密码,此时线程之间不会相互中断?

谢谢!, 尼迪

【问题讨论】:

  • 我认为您需要进一步解释该问题。不同的线程是否共享一个到服务器的连接?
  • 您希望多个线程能够同时连接到服务器吗? (Web 浏览器通常会打开到同一服务器的多个连接以一次加载大量内容。)或者您一次只希望 1 个线程与服务器联系?
  • 在您刚刚发布的代码中,您正在 TelnetConnectorThreads[countofThreads] 中创建 ga 线程,然后尝试启动 TelnetConnectorThreads[intIndex](注意索引变量)

标签: c# .net multithreading timeout


【解决方案1】:

我非常怀疑这里的问题是真正线程争用。

线程时间片非常快,并且服务器必须有一个荒谬短暂的超时才能使您的诊断正确。

我的猜测是您的代码有一些不同的问题,但如果没有看到一些代码,我们无法真正判断它是什么。

【讨论】:

【解决方案2】:

线程通常以毫秒为单位交换,所以我认为这不是导致您的程序断开连接的原因。

也就是说,您可以实现锁/互斥锁以确保在没有其他线程执行其代码的情况下执行关键代码,甚至使用线程优先级来确保一个线程优先于其他线程 - 但您不能强制线程不让步,操作系统可以决定你已经运行了足够长的时间并强制你放弃。此外,您所寻找的行为在所有现代计划中或多或少都被明确阻止,以防止其他进程饥饿。

【讨论】:

    【解决方案3】:

    您似乎正试图在一个套接字上多路复用多个数据流。因此,您在等待服务器时可能会遇到线程切换问题,但如果是这种情况,您可能正在做这样的事情,这是一种不适合多线程的方式。

    void Task(int type)
    {
      // Authenticate
      // Send Data
      // Disconnect
    }
    
    // Connect
    Thread.Start(Task(1));
    Thread.Start(Task(2));
    Thread.Start(Task(3));
    

    如果您有线程 1、2 和 3 在服务器上协同工作,您有几种方法可以做到:

    1.) 使用不同的连接来处理您的工作

    void Task(int type)
    {
      // Connect
      // Authenticate
      // Send Data
      // Disconnect
    }
    
    Thread.Start(Task(1));
    Thread.Start(Task(2));
    Thread.Start(Task(3));
    

    2.) 使用一个连接进行单线程工作

    void 任务(int 类型) { // 发送数据 }

    // 连接 // 认证 任务1); 任务(2); 任务(3); // 断开连接

    3.) 使用多个连接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 2012-06-27
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多