0

私は、1日の時刻に基づいて1日あたり100〜1000接続の多くのtcp接続を処理するサーバーを実装しようとしています。接続ごとのスレッドに関するc10k問題について多くのことを読み、epollのみを使用した後、スレッドのプールとして両方を使用することにしました。メインはディスパッチャーとして機能するため、新しい接続はそれぞれスレッドに割り当てられます。

他では答えが見つからない質問がたくさんあります。次のスレッドは安全ですか?新しい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 に答える