1

假设:
1、reactor线程有3个,worker进程有4个。
2、reactor线程使用取模的方式来选择一个worker进程的时候。
情况:
有一个connfd是1,那么,reactor线程1(1 % 3 = 1)会处理这个连接,并且把connfd1这个连接发来的数据传给worker进程1(1 % 4 = 1)。
有一个connfd是5,那么,reactor线程2(5 % 3 = 2)会处理这个连接,并且把connfd5这个连接发来的数据传给worker进程1(5 % 4 = 1)。
疑问:
那么,reactor线程1在等待worker进程1返回数据的时候,会不会被reactor线程2给取走?这么一来,本应该是reactor线程1处理的connfd1被reactor线程2给处理了?

保密 101
2019-01-09 提问
1 个回答
0

已采纳

并不会啊,他们之间通过管道通信,而且管道是加了锁的.

for (i = 0; i < serv->worker_num; i++)
    {
        if (i % serv->reactor_num != reactor_id)
        {
            continue;
        }

        pipe_fd = serv->workers[i].pipe_master;

        //for request
        swBuffer *buffer = swBuffer_new(sizeof(swEventData));
        if (!buffer)
        {
            swWarn("create buffer failed.");
            return SW_ERR;
        }
        serv->connection_list[pipe_fd].in_buffer = buffer;

        //for response
        swSetNonBlock(pipe_fd);
        if (reactor->add(reactor, pipe_fd, SW_FD_PIPE) < 0)
        {
            return SW_ERR;
        }

        if (thread->notify_pipe == 0)
        {
            thread->notify_pipe = serv->workers[i].pipe_worker;
        }

        /**
         * mapping reactor_id and worker pipe
         */
        serv->connection_list[pipe_fd].from_id = reactor_id;
        serv->connection_list[pipe_fd].fd = pipe_fd;
        serv->connection_list[pipe_fd].object = sw_malloc(sizeof(swLock));

        /**
         * create pipe lock
         */
        if (serv->connection_list[pipe_fd].object == NULL)
        {
            swWarn("create pipe mutex lock failed.");
            return SW_ERR;
        }
        swMutex_create(serv->connection_list[pipe_fd].object, 0);
    }

撰写答案

推广链接