gpt4 book ai didi

C套接字,第一个连接的线程关闭其余的

转载 作者:行者123 更新时间:2023-12-03 11:52:04 25 4
gpt4 key购买 nike

客户端可以同时连接到 n 对服务器。
一旦其中第一个成功,它必须向所有其他线程发送信号,以关闭试图连接的剩余线程。
我应该使用可连接线程来做到这一点吗?如果是,至少在概念上,我应该如何进行?

谢谢大家

最佳答案

我们考虑一种情况,请求了 n 个资源,获得的第一个资源取消了所有其他请求。在您的特定情况下,资源是套接字连接。

如果可以异步请求资源( future/promise ),那么必须有一个协议(protocol)来

  • 要么定期检查请求的状态(轮询),要么接收该请求完成的通知(处理程序),
  • 可能取消请求

  • 在该模型中,您只需要一个线程来启动所有请求并轮询/等待通知。一旦获得一个或多个资源,选择其中一个,关闭其他的,并取消所有剩余的需求(如果无法取消,只需在通知时释放每个额外的资源,或者专门一个额外的线程轮询它们并释放收到时)。

    如果资源请求命令是同步的(阻塞套接字 connect 调用),您确实需要 n并发线程,每个都调用阻塞函数。在返回时,他们每个人都应该检查一个标志,表明另一个线程是否首先获得了他的资源。如果不是这种情况,则线程定位标志并继续。否则,线程释放资源。
    该标志必须是原子的或互斥保护的。

    作为一个类比,想象 n 名参赛者之间的比赛:他们一个接一个地开始比赛,他们必须夺取一面旗帜才能继续比赛。为了做到这一点,他们必须进入一个一次只允许一个人的房间(互斥体),但首先他们必须得到一个号码(连接到服务器)。一旦参赛者成功获得号码,她就会走到门前并尝试进入房间(拿着互斥锁)。如果里面没有人,她会进入(或者她等到房间空了),并检查标志是否仍然存在( flag == 0)。如果是,她接受它( flag = 1;),然后继续。否则,她必须交还她的号码并退出比赛(关闭连接并退出)。

    线程任务基本如下:
    void task(address){
    int socket = connect(address);
    If (!check_flag()){
    proceed(socket);
    } else {
    close(socket);
    }
    }

    在哪里 proceed是与套接字的剩余工作。 check_flag功能说明如下。

    使用 pthreads,你有 pthread_mutex实现它。如果机器 memory model允许的话,你也可以使用简单的 volatile整数,但它显然是不可移植的。

    从根本上说,只需要一个函数来处理标志。伪代码如下所示:
    int flag;

    int check_flag(){
    int result=0;
    lock();
    result = flag;
    flag = 1;
    unlock();
    return result;
    }

    它返回标志是否已经设置,并设置它。

    我应该补充一下 atomic variables 提供可选支持.请参阅您的 OS C 编译器文档。

    关于C套接字,第一个连接的线程关闭其余的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394171/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com