Где хранить сокеты подключившихся клиентов?
Подскажите пожалуйста, где хранить сокеты подключившихся клиентов ?
Собственно варианта минимум три:
**1)**В статическом массиве или векторе, по типу:
std::vector<SOCKET>my_vec_socket;
my_vec_socket.resize(10000);
Но в этом случае необходимо или знать точно заранее кол-во максимальных соединений, что маловероятно или выделять память с запасом, но и тут не угадаешь.
**2)**Использовать для хранения std::list - постоянно добавляя в конец сокеты вновь подключившихся клиентов. Тут заранее кол-во подключений знать не надо, но проблема в медленной итерации по листу, что наверное не очень подходит для сервера.
**3)**Можно использовать push_back`и вектора, но так как в какой то момент вызова push_back, внутри вектора вызовется realloc, то надо все операции с сокетами держать под мьютексами, что тоже очень снижает эффективность работы сервера.
И вот может есть еще какие нибудь методы более эффективные ?
Ответы (1 шт):
Похоже на преждевременную оптимизацию.
Даже без переаллокации, у вектора поедет крыша, если его пушбекать без мьютекса. Однако эту проблему можно решить при помощи атомарной переменной и операций типа COMPARE-AND-SWAP - в этом случае, мьютекс будет нужен только в момент переаллокации.
Уже готовая реализация такой стратегии есть в Facebook/folly - я ей пользуюсь и она действительно работает очень быстро.