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

what exactly is fiber safe optimizations in VC++?

本文关键字:光纤 安全 优化 VC++ 什么      更新时间:2023-10-16

我在MSDN上读到了有关光纤安全优化的文章。上面说

使用__declspec(线程)声明的数据通过线程本地存储(TLS)阵列TLS阵列是系统为每个线程维护的地址。中的每个地址这个数组给出线程本地存储数据的位置。纤维是由堆栈和寄存器上下文组成的轻量级对象并且可以在各种线程上调度。光纤可以在任何线因为光纤可能会在不同的线程,TLS阵列的地址不得缓存或作为函数调用的通用子表达式进行优化

什么是光纤安全优化?使用它的实际目的是什么?为什么他们说"因为光纤可能会交换出去,然后在不同的线程上重新启动,所以TLS阵列的地址不能作为函数调用中的公共子表达式进行缓存或优化。"?为什么以及何时应该预防?

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",而您很可能没有。如果你是这样的话,你就会知道,一部分是因为你早上醒来时对生活充满了灵魂般的仇恨,另一部分是你知道纤维是什么。

---编辑---

"Fiber"被广泛用于描述一个"轻量级"的执行单元,它没有操作系统线程的功能,尤其是它不会自动运行。根据您的需求,光纤实际上可能比线程便宜。它们经常与协同活动联系在一起(参见https://en.wikipedia.org/wiki/Fiber_(computer_science)#Fibers_and_coroutines)。请注意,C++语言的未来版本可能包括光纤概念的标准实现(请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf)