c++ - Boost Thread Specific 指针 get() 方法所花费的大概时间

标签 c++ windows multithreading performance thread-local-storage

我们正在使用 boost 线程特定指针来仅为该特定线程存储一些全局数据。下面是当有人调用 GetInstance() 时我们返回的单例。

我的问题是,与普通指针访问相比,获取线程特定指针 (m_tspConnectionManager.get();) 大约需要多长时间?

我使用了下面的代码(我调用了 .get() 方法两次),完成整个函数大约需要 3 秒。

  typedef boost::thread_specific_ptr<ConnectionManager> ConnMgrPtr;
    static ConnMgrPtr m_tspConnectionManager;
    static ConnectionManager* GetInstance()
            {
                if(!m_tspConnectionManager.get())
                {
                    //first time called by this thread
                    //ConnectionManager* to be used in all subsequent calls from this thread
                    m_tspConnectionManager.reset(new ConnectionManager());
                }
                return m_tspConnectionManager.get();
            }

现在,我将上面的代码更改为只调用一次 .get() 方法,它花费了大约 1.9 秒。

    static ConnectionManager* GetInstance()
            {
                ConnectionManager* pConnMgr = m_tspConnectionManager.get();
                if(pConnMgr == NULL)
                {
                    //first time called by this thread
                    //ConnectionManager* to be used in all subsequent calls from this thread
                    m_tspConnectionManager.reset(new ConnectionManager());
                }
                return pConnMgr != NULL ? pConnMgr : m_tspConnectionManager.get();
            }

所以,只要不调用 .get() 方法,我就能看到 1.1 秒的性能提升。我一直在试图了解我们如何获得 yield ? 注意:这个 yield 可能是多次调用GetInstance()函数的集体 yield 。只是想了解这里的单个通话增益。

最佳答案

get() 不太可能花费很多时间(当然,它比不调用 get() 慢)。 TLS,您的对象最多只有三个指针间接距离。 (线程 block 寄存器 -> TLS block -> 你的指针。)但是如果你调用 GetInstance() 的次数足够多,那么任何减速都可能变成一个很大的减速。

我会查看 GetInstance() 被调用的频率。尝试通过缓存返回的指针来减少该数字。当然,第二种实现优于第一种。

关于c++ - Boost Thread Specific 指针 get() 方法所花费的大概时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725725/

相关文章:

java - 为什么 Thread.stop() 如此危险

c++ - 如何在 C++ 中使用 boost::dynamic_bitset

c++ - 获取 Linux 机器上所有连接的 IP

c++ - 模板类的复制构造函数

c++ - fclose 不关闭音频文件

c++ - 如何检查我的多线程程序是否在 C++ 中正常运行?

c++ - Windows 7 上的奇怪行为 QT QSerialPort 不会更改串行 com 端口的设置

windows - 如何在 Windows 中从命令提示符或 powershell 更改驱动器号

windows - 操作系统不会关闭,但我的应用程序会

java - 使用并行流和原子变量期间发生的竞争条件