Что точно оптимизирует безопасность волокна в VС++?

Я читал о Оптимизация Fiber Safe в MSDN. В нем говорится, что

Данные, объявленные с помощью __ declspec (поток), ссылаются через массив потоковых локальных хранилищ (TLS). Массив TLS представляет собой массив адреса, которые система поддерживает для каждого потока. Каждый адрес в этот массив дает расположение данных локального хранилища потоков. Волокно легкий объект, состоящий из стека и контекста регистров и могут быть запланированы на разных потоках. Волокно может работать на любом нить. Поскольку волокно может быть заменено и перезапущено позже другой поток, адрес массива TLS не должен кэшироваться или оптимизирован как общее вспомогательное выражение для вызова функции

Что такое оптимизация безопасности волокна? Какова фактическая цель его использования? Почему они говорят, что "поскольку волокно может быть заменено и перезапущено позже в другом потоке, адрес массива TLS не должен кэшироваться или оптимизироваться как общее вспомогательное выражение в вызове функции".? Почему и когда это следует предотвратить?

Ответ 1

Fiber (в этом контексте) - это специфичная для MS технология, которая позволяет вам вручную управлять планированием "легких" потоков, но они сосуществуют с потоками. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661(v=vs.85).aspx

Представьте, что у вас есть волокно, у которого есть длинный кусок работы и два рабочих потока.

Волокно работает на одном потоке и выполняется. Затем следующий поток получает процессорное время. Он находит, что волокно должно бежать, поэтому он запускает волокно.

Пока это не проблема. Если вы не используете локальное хранилище потоков.

__declspec(thread) int global_int;

Каждый созданный поток видит свой собственный уникальный экземпляр этой переменной. Если ваш волоконный код использует такие переменные, и вы разрешаете волокну переходить между потоками, тогда базовая переменная может измениться. Наиболее очевидным из них является, конечно, thread id.

void fiber_in_your_diet() {
    Queue& thread_queue = g_threadQueues[std::thread::get_id()];
    // long work that gets transferred to a different thread
    thread_queue.push_back(something); // wrong queue!
}

"Оптимизация оптоволокна" является неправильным. Вам нужно только "/GT", если вы используете Fibers, и есть вероятность, что вы этого не сделали. Вы бы знали, были ли вы, отчасти из-за душевной ненависти к жизни, с которой вы проснулись утром, и отчасти потому, что знаете, что такое волокна.

--- EDIT ---

"Fiber" довольно широко используется для описания "легкой" единицы исполнения, которая не имеет колоколов и свистов нити операционной системы, в частности, она не запускается автоматически. В зависимости от ваших требований, действительно, волокна могут быть менее дорогими, чем потоки. Они очень часто связаны с сопрограммами (см. https://en.wikipedia.org/wiki/Fiber_(computer_science)#Fibers_and_coroutines). Обратите внимание, что будущие версии языка С++ могут включать стандартную реализацию концепции Fiber (см. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf)