Вы можете сделать оба. Вы можете иметь несколько потоков, запускающих epoll()
на одном и том же наборе fd, и операционная система будет запускать потоки по мере необходимости. Это также очень легко сделать, особенно если вам не нужно делиться: просто fork()
пятьдесят раз или около того, и Linux будет переключать контекст при необходимости и epoll, когда нет. Когда я делаю это, я просто делаю что-то вроде этого:
{char*s=getenv("THREADS");int n=atoi(s?s:"0"),i;
for(i=0;i<n;i++)if(fork()==0)break;}
Если вам нужно поделиться, то вам понадобится блокировка. Это может усложнить ситуацию, и такие проблемы программирования в общем смысле трудно решить. По моему опыту, за исключением некоторых очень простых баз данных, обычно проще либо отказаться от потоков, либо реорганизовать программу, чтобы не требовать блокировки общих структур.