У меня есть некоторый код C ++, использующий локальное хранилище потоков, у каждого потока есть вектор, в который они могут помещать данные.
Я использую TLS для хранения идентификатора индекса для каждого потока, это можно использовать для поиска, в какой вектор помещать данные. Затем он выполняет достаточное количество кода, который помещает данные в вектор.
Что мне интересно, так это то, может ли ОС перепланировать мой код для выполнения в другом потоке после получения указателя на локальный объект потока. (Пока код выполняется нормально, и я не видел, чтобы это произошло). Но если бы это было возможно, казалось бы, это наверняка сломало бы мою программу, поскольку теперь два потока могли бы иметь один и тот же объект.
Если предположить, что это правда, похоже, что это будет проблемой даже для любого кода, который использует TLS любой сложности. Разве TLS предназначен только для простых объектов, где вы не берете адрес?
Спасибо!
Локальное хранилище потоков — это просто хранилище на поток. Каждый поток имеет свою собственную структуру данных. Этот поток, независимо от того, на каком процессоре он работает, является одним и тем же потоком. ОС не планирует работу внутри потоков, она планирует, какой из потоков работает.
Локальное хранилище потока достигается наличием некоторой косвенности, которая изменяется вместе с самим потоком. Есть несколько способов сделать это, например, ОС может иметь определенную страницу с определенным смещением от начала виртуальной памяти в процессе, и когда поток запланирован, таблица страниц обновляется, чтобы соответствовать потоку.
В процессорах x86 FS или GS обычно используются для данных «на поток», поэтому ОС будет переключать регистр FS [или содержимое базового адреса регистра в случае 64-битных процессоров]. При чтении TLS, компилятор будет использовать регистр сегмента FS или GS для префикса операций чтения / записи в памяти, и, таким образом, вы всегда получите «ваши личные данные», а не некоторые другие потоки.
Конечно, в ОС могут быть ошибки, но это то, на что может положиться несколько вещей, поэтому, если он сломан, он обнаружится довольно скоро (если только он не очень тонкий, и вы должны стоять просто в нужном месте, с луна в правильной фазе, одежда в правильном цвете и ветер в правильном направлении, дата делится на 3 и 7 и т. д. и т. д.).
TLS означает поток местный, Исходя из вашего описания, каждый поток обращается к общему вектору вектора через TLS (я не уверен), вы должны использовать какую-то блокировку. Какие-нибудь примеры кодов?