什么是VC++中的光纤安全优化?

Des*_*tor 11 c++ arrays optimization multithreading visual-c++

我正在阅读有关MSDN上的光纤安全优化的文章.它说

使用__declspec(thread)声明的数据通过线程局部存储(TLS)数组引用 .TLS数组是系统为每个线程维护的地址数组.此数组中的每个地址都给出了线程本地存储数据的位置.光纤是一个轻量级对象,由堆栈和寄存器上下文组成,可以在各种线程上进行调度.光纤可以在任何线程上运行.由于光纤可能会在以后的另一个线程上被换出并重新启动,因此不能将TLS数组的地址作为函数调用中的公共子表达式进行缓存或优化

什么是光纤安全优化?使用它的实际目的是什么?他们为什么这么说"因为光纤可能会被换出并稍后在另一个线程上重新启动,所以不能将TLS数组的地址缓存或优化为函数调用中的公共子表达式."?为什么以及何时应该预防?

kfs*_*one 18

Fibers(在此上下文中)是一种特定于MS的技术,可让您手动控制"轻量级"工作线程的调度,但它们与线程共存.https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661(v=vs.85).aspx

想象一下,你有一条纤维需要做很长的工作和两个工人的线程.

光纤在一个线程上运行并被预先安排.然后下一个线程获得处理器时间.它发现光纤需要运行,因此它运行光纤.

到目前为止,不是问题.除非您使用线程本地存储.

__declspec(thread) int global_int;
Run Code Online (Sandbox Code Playgroud)

您创建的每个线程都会看到此变量的唯一实例.如果光纤代码使用这样的变量并允许光纤在线程之间转换,那么底层变量可能会发生变化.其中最明显的当然是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!
}
Run Code Online (Sandbox Code Playgroud)

"光纤安全优化"是用词不当.如果你正在使用纤维,你只需要"/ GT",而你可能没有.你会知道,如果你是这样,部分是因为你早上醒来时对生命产生了消耗灵魂的仇恨,部分原因是你会知道什么是纤维.

---编辑---

"光纤"被广泛用于描述"轻量级"执行单元,它没有操作系统线程的花哨,特别是它不会自动运行.根据您的要求,纤维实际上可能比螺纹便宜.它们通常与协同程序相关联(请参阅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)

  • *"你知道你是不是"*:-). (3认同)