Самый большой вопрос, который у меня к вам, - архитектурный. Действительно ли поток для каждого соединения нуждается в прямом доступе к этому массиву других соединений? Разве они не должны ставить в очередь какие-то абстрактные сообщения? Если каждый поток соединения осознает детали реализации юниверса, в котором он живет, я ожидаю, что у вас возникнут проблемы где-то в будущем.
Но давайте предположим, что потокам соединения действительно нужен прямой доступ друг к другу ...
Глобальные переменные по своей природе не являются злом; школы просто учат этому, потому что это проще, чем предоставлять детальное понимание. Вы должны точно знать, что такое глобальная переменная, и приличное эмпирическое правило полагать, что глобальный - это неправильный выбор, пока вы не обнаружите, что у вас нет альтернативы. Одна альтернатива, которая решает ряд проблем, заключается в написании такой функции:
SharedVector & GetSharedVector (void)
{
static SharedVector sharedVector;
return sharedVector;
}
Это дает вам больше контроля над тем, когда создается экземпляр класса, чем с глобальной переменной, что может быть критично, если у вас есть зависимости среди глобальных переменных, которые имеют конструкторы, особенно если эти глобальные переменные порождают потоки. Это также дает вам возможность вступать в конфликт, когда кто-то хочет получить доступ к этой «глобальной» переменной, а не просто бессильно страдать, пока они прямо тыкают в нее.
Ряд других мыслей также приходит на ум. Без определенного порядка ...
- Вы, несомненно, уже знаете
Синтаксис шаблона, который вы используете здесь
странно; Я предполагаю, что вы только что набрали
этот код без компиляции.
- Вам нужно сделать ничего не делать
оператор в вашем личном разделе
предотвратить несчастные случаи (для того же
причина, у вас есть ничего не делать копию
конструктор есть).
- Явный конструктор копирования
сломано несколькими способами. Нужно
явно скопировать вектор или
вы получите пустой вектор в вашем новом экземпляре SharedVector.
И он должен просто инициализировать его
собственный критический раздел, а не
скопируйте это (и затем инициализируйте это).
Действительно для твоего случая это наверное
не имеет смысла иметь это
функционировать вообще, потому что сеть
соединения не имеют разумного
копировать семантику.
- Вы можете упростить безопасность исключений
создавая класс
EnteredCriticalSection, чья
вызов конструктора
EnterCriticalSection и чей
вызовы деструкторов
LeaveCriticalSection. (Нужно
держаться за ссылку на
критический раздел, конечно.) Это
облегчает безопасную работу
сериализовать вашего другого члена
функции перед лицом исключений.