c++ - 使用线程本地存储将具有全局变量的单线程遗留代码转换为多线程代码

标签 c++ multithreading thread-local-storage

我有一个遗留 C/C++ 代码的代码库,其中包含许多访问全局静态变量的函数,因此不是线程安全的。我正在寻找有关如何转换此代码以使其线程安全的建议。我想到一种方法是将静态变量转换为线程局部变量,或者以其他方式将它们存储在线程局部存储中。这样做的优点是,我不必重写大量使用函数向它们传递额外上下文的代码,只需重写线程不安全函数本身。但在研究过程中,我并没有找到很多关于这是好还是坏主意的建议。我的一些具体问题是

  • 访问基于 TLS 的数据会明显变慢吗?
  • 我是否只是继续陷入使用全局变量的陷阱,因为“全局变量很糟糕”,或者 TLS 是否抵消了全局变量很糟糕的论点?

任何其他想法也将不胜感激。

最佳答案

首先,最好确定哪些全局变量可以以可变方式访问,哪些不能。在某些情况下,变量一旦设置就不会被实际修改,只是这些变量的初始化现在会给非确定性程序带来问题。这些变量,其中初始化顺序很重要,我将放置在它们自己的类中,这些类可以传播到需要它们的每个单独的线程。

在那之后,我相信你的问题只会变得更加复杂。我和你一样,也对你表示同情。

关于c++ - 使用线程本地存储将具有全局变量的单线程遗留代码转换为多线程代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701521/

相关文章:

java - 为什么这不会通知线程?

c - 逻辑帮助 : Calculating primes of a range of numbers with multiple threads

php - 如何在每个线程的PHP扩展中封装全局变量?

multithreading - C++11 中的动态 TLS

.net - 使用 TPL 时如何管理线程本地存储 (TLS)?

c++ - 如何配置 Codeblocks 在程序完成后不关闭控制台?

c++ - 获取文件数据预处理器宏

具有参数化基类的 C++ CRTP?

c++ - C语言的Windows UIAutomatin

c# - WPF - 从另一个线程更新 "System.Windows.Controls.Image"