什么是VC++中的光纤安全优化
what exactly is fiber safe optimizations in VC++?
我在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)
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 什么是VC++中的光纤安全优化