我在MSDN上阅读Fiber Safe optimizations。它说
使用 __ declspec(thread)声明的数据通过a引用 线程局部存储(TLS)数组。 TLS数组是一个数组 系统为每个线程维护的地址。每个地址 此数组提供线程本地存储数据的位置。纤维是 一个轻量级对象,由堆栈和寄存器上下文组成 并可以安排在各种线程上。光纤可以在任何光纤上运行 线。因为光纤可能会被换出并在以后重新启动 不同的线程,不得缓存TLS数组的地址或 优化为函数调用中的公共子表达式
什么是光纤安全优化?使用它的实际目的是什么?为什么他们这样说"因为光纤可能会被换出并稍后在另一个线程上重新启动,所以不能将TLS数组的地址缓存或优化为函数调用中的公共子表达式。" ?为什么以及何时应该阻止它?
答案 0 :(得分:17)
Fiber
s(在此上下文中)是一种特定于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,那么你很可能没有。你知道自己是否曾经,部分是因为你早上醒来时对生命产生的消极仇恨,部分原因是你会知道什么是纤维。
---编辑---
"纤维"被广泛用于描述轻量级"没有操作系统线程的花里胡哨的执行单元,特别是它不会自动运行。根据您的要求,纤维实际上可能比螺纹便宜。它们通常与协同程序相关联(参见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)