C++11 §1.10/1 определяет термины:
поток выполнения (также известный как поток) – это единый поток управления внутри программы, включающий начальный вызов определенной функции верхнего уровня и рекурсивно включающий каждый вызов функции, впоследствии выполняемый потоком. [ Примечание. Когда один поток создает другой, первоначальный вызов функции верхнего уровня нового потока выполняется новым потоком, а не создающим потоком. — конец примечания ]
Выделенные курсивом термины указывают на то, что это окончательно. Вы можете возразить, что это определение математически некорректно, потому что каждый вызов функции определяет новый поток, но это явно неверно. Они означают максимальный единый поток управления, иначе ненормативное примечание отменило бы действие нормативного "рекурсивно включающего" текста.
С точки зрения базового языка просто случайно, что std::thread
вызывает существование такой вещи.
Что, если я использую библиотеку, которая предоставляет потоки пользовательского пространства — каждый из них получает свои собственные копии объектов thread_local
(я действительно не понимаю, как это можно реализовать)?
Невозможно написать такую библиотеку без вызовов ядра. По всей вероятности, все потоки в вашем процессе уже представлены высокоуровневой абстракцией, такой как pthreads, просто для удовлетворения требований ядра. Стандартная библиотека C++, скорее всего, написана против родной библиотеки потоков, чтобы «просто работать» без дополнительного клея.
Например, объекты thread_local
инициализируются при первом доступе, а не при запуске каждого нового потока, поэтому компилятору просто нужно вставить запрос на основе pthread_self
для доступа и, возможно, инициализации. Инициализация зарегистрирует деструктор с помощью средства pthread_cleanup
.
Реализация здесь определяется тем, совместима ли уже существующая нативная библиотека с C++. Предположим, что они предоставляют это, а это то, что клиенты, как правило, хотят, все другие библиотеки потоков, созданные на его основе, будут автоматически совместимы, исключая какой-либо другой конфликт.
person
Potatoswatter
schedule
05.11.2013