【问题标题】:Thread workers and epoll线程工作者和 epoll
【发布时间】:2013-03-15 14:36:41
【问题描述】:

我正在尝试实现一个服务器来处理许多 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
}

【问题讨论】:

  • 每天 1000 个连接?您的目标是计算尺吗?
  • 将 C 标签读为 C++,编辑了我的评论

标签: c linux network-programming


【解决方案1】:

如果你这样做:

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

在线程函数中,这个:

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

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

【讨论】:

  • 谢谢,虽然“假设您在 *p_epfd 中的正确位置检查更新”但没有得到这部分
  • 这正是我所想的,所以如果它是线程安全的,那真的有用吗?如果是,那么我不知道如何实现它。
  • 如果你使用间接*p_epfd 来访问描述符应该没问题
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2016-02-21
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多