多线程,每个线程都selecet为什么不会出现类似“惊群”的现象

发布于 2022-09-30 07:16:54 字数 1995 浏览 14 评论 0

有多个多线程,每个线程都selecet,为什么当一个socket可读的时候,不会唤醒每个线程里的select

        for(int i = 0; i <THREAD_NUMBER; i++)
        {
                pthread_create(&pid[i], NULL, &start, NULL);
              //    sleep(1);
        }

void* start(void* pParam)
{

                int fd = socket(PF_INET, SOCK_STREAM, 0);
                sockaddr_in sa_in;
                memset(&sa_in, 0, sizeof(sa_in));
                sa_in.sin_family = AF_INET;
                sa_in.sin_port = htons(3007);
                sa_in.sin_addr.s_addr = inet_addr(ipaddr);
                int ret = connect(fd, (struct sockaddr*)&sa_in, sizeof(sa_in));
           
           //往echo server写,在把“abc”从server读回来
           write(fd,"abc",3)

           //1024一般为linux最大socket值,就是本进程所有的socket都select到了
          if (select(1024,&readfds, NULL, NULL, &tv) > 0)
          {

           }

       }

上面是一些骨架代码,,奇怪的是线程1的echo只会被线程1的select到,为什么不会被“线程2”select到?当一个socket可读的时候,它怎么知道要唤醒正在select它的线程。它应该只能通知到socket所在的进程吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文