Ответ 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)