вопрос о поточно-ориентированной STL и отладке STL - PullRequest
4 голосов
/ 13 апреля 2010

У меня есть два вопроса о STL

1) почему STL не является поточно-ориентированным? Есть какая-нибудь структура, которая является поточно-ориентированной?

2) Как отлаживать STL с помощью GDB? В GDB, как я могу напечатать вектор?

Ответы [ 4 ]

4 голосов
/ 13 апреля 2010
  1. Структуры данных контейнера почти всегда требуют синхронизации (например, мьютекс ) для предотвращения условий гонки . Поскольку многопоточность не поддерживается стандартом C ++ (до C ++ 0x), они не могут быть добавлены в STL. Кроме того, синхронизация очень дорога для случаев, когда она не нужна. Контейнеры STL могут использоваться в многопоточных приложениях, если вы выполняете эту синхронизацию вручную. Кроме того, вы можете создать свои собственные потокобезопасные контейнеры, которые совместимы с алгоритмами STL, такими как эта потоковая безопасная круговая очередь .
  2. A vector содержит непрерывный блок памяти. Таким образом, он может отображаться так же, как обычный массив, когда вы найдете указатель на этот блок памяти. Точные детали зависят от используемой вами реализации STL.
3 голосов
/ 13 апреля 2010

Стандартные контейнеры c ++ не являются потокобезопасными, потому что вы, скорее всего, на самом деле хотите блокировку более высокого уровня, чем сами контейнеры. Другими словами, вы, вероятно, захотите, чтобы две или более операции были безопасными вместе.

Например, если у вас запущено несколько потоков:

v.push_back(0);
v.push_back(1);

Вы не получите хороший вектор чередования 0 и 1, они могут быть перемешаны. Вам нужно заблокировать обе команды, чтобы получить то, что вы хотите.

1 голос
/ 13 апреля 2010
  1. Поскольку все еще существуют однопоточные программы.
  2. Взгляните здесь .
1 голос
/ 13 апреля 2010

STL не является потокобезопасным, потому что многим людям не нужна безопасность потоков, и потому что это вводит контекст потоков в классы, которым в противном случае не нужно ничего знать о концепции потоков.

Вы можете инкапсулировать доступ к контейнерам и обеспечивать собственную безопасность потоков (или другие ограничения, налагаемые вашей конкретной конструкцией и реализацией.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...