Где хранить сокеты подключившихся клиентов?

Подскажите пожалуйста, где хранить сокеты подключившихся клиентов ?

Собственно варианта минимум три:

**1)**В статическом массиве или векторе, по типу:

std::vector<SOCKET>my_vec_socket;
my_vec_socket.resize(10000);

Но в этом случае необходимо или знать точно заранее кол-во максимальных соединений, что маловероятно или выделять память с запасом, но и тут не угадаешь.

**2)**Использовать для хранения std::list - постоянно добавляя в конец сокеты вновь подключившихся клиентов. Тут заранее кол-во подключений знать не надо, но проблема в медленной итерации по листу, что наверное не очень подходит для сервера.

**3)**Можно использовать push_back`и вектора, но так как в какой то момент вызова push_back, внутри вектора вызовется realloc, то надо все операции с сокетами держать под мьютексами, что тоже очень снижает эффективность работы сервера.

И вот может есть еще какие нибудь методы более эффективные ?


Ответы (1 шт):

Автор решения: gbg

Похоже на преждевременную оптимизацию.

Даже без переаллокации, у вектора поедет крыша, если его пушбекать без мьютекса. Однако эту проблему можно решить при помощи атомарной переменной и операций типа COMPARE-AND-SWAP - в этом случае, мьютекс будет нужен только в момент переаллокации.

Уже готовая реализация такой стратегии есть в Facebook/folly - я ей пользуюсь и она действительно работает очень быстро.

→ Ссылка