2013-03-25 62 views
0

我試圖實現一個服務器,處理許多tcp連接,從100 - 1000個連接/天基於一天的時間。在閱讀了關於每個連接的線程的c10k問題並使用epoll後,我決定使用兩者作爲線程池,並且main將充當調度程序,因此每個新連接都將分配給一個線程。線程工作者和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 
} 
+1

每天1000個連接?您是否定位了幻燈片規則? – 2013-03-25 23:04:01

+0

閱讀C標記爲C++,編輯我的評論 – 2013-03-26 02:28:19

回答

0

如果你這樣做:

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

,並在線程函數,這樣的:

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

那麼它應該工作,並且是線程安全的,假設你檢查在正確的地方更新*p_epfd

+0

謝謝,雖然「假設你檢查* p_epfd中的更新在正確的位置」並沒有得到這部分「 – 2013-03-26 03:54:33

+0

我的意思是避免在更新後使用舊值 – perreal 2013-03-26 04:32:42

+0

這正是我在想什麼,所以如果它是線程安全的,那真的會變得更好嗎?如果是的話,我不知道如何實現它。 – 2013-03-26 05:08:18