0

我正在尝试实现一个处理许多 tcp 连接的服务器,根据一天中的时间从 100 到 1000 个连接/天。在阅读了很多关于每个连接线程的 c10k 问题并仅使用 epoll 之后,我决定将两者都用作线程池,并且 main 将充当调度程序,因此每个新连接都将分配给一个线程。

我有很多问题在其他任何地方都找不到答案。以下线程安全吗?在添加新的 fd 之前我需要锁定吗?

int main ()
{
    while(i < number_threads)
      {         
        pthread_create( &id , NULL ,  worker , (void*) epoll_fd[i]);
        i++;
      }


//is it ok to add the new_sock for the epoll_fd[i] so the thread can pick it up
int y = 0;
    while(1) {
        new_sock = accept(...);
           if (epoll_ctl(epoll_fd[y], EPOLL_CTL_ADD, new_sock, &ev) < 0)
            {
                print error; 
            }
    y++;
    if (y == number_threads)
    y = 0;
    }

}



void *worker(void *epfd)
{
epoll_wait //start waiting for event
}
4

1 回答 1

0

如果你这样做:

pthread_create( &id , NULL ,  worker , (void*) epoll_fd + i);

在线程函数中,这个:

void *worker(void *vp_epfd) {
  int *p_epfd = (int*) vp_epfd;

那么它应该可以工作,并且是线程安全的,假设您*p_epfd在正确的位置检查更新。

于 2013-03-26T02:25:03.623 回答