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

时间:2015-06-25 06:22:04

标签: c++ arrays multithreading visual-c++ optimization

我在MSDN上阅读Fiber Safe optimizations。它说

  

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

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

1 个答案:

答案 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