我在MSDN上阅读有关Fiber Safe optimizations的信息。它说
什么是光纤安全优化?使用它的实际目的是什么?为什么要说“由于光纤可能会换出并稍后在不同的线程上重新启动,所以TLS阵列的地址一定不能作为函数调用中的公共(public)子表达式进行缓存或优化”。为什么以及何时应该预防?
最佳答案
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!
}
“光纤安全优化”是一个误称。如果您使用的是Fibers,则仅需要“/GT”,而您可能没有。您会知道自己是否是,部分是因为早晨醒来时对生命的强烈厌恶,另一部分是您将了解Fibre是什么。
- - 编辑 - -
“光纤”被广泛地用来描述“轻量级”的执行单元,它没有操作系统线程的风吹草动,特别是它不会自动运行。根据您的要求,光纤实际上有可能比线程便宜。它们通常与协程相关联(请参阅https://en.wikipedia.org/wiki/Fiber_(computer_science)#Fibers_and_coroutines)。请注意,将来的C++语言版本可能包含Fiber概念的标准实现(请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf)