C-u declspec(线程)变量性能

C-u declspec(线程)变量性能,c,multithreading,performance,declspec,C,Multithreading,Performance,Declspec,我正在研究一个库的多线程实现。在这个库的一个模块中有一些全局变量(在程序执行中经常使用)。为了使对这些变量的访问更加安全,我使用线程本地存储(TLS)关键字\uu declspec(Thread)声明了它们 下面是对库外部函数的调用。此函数使用具有全局变量的模块: for(i = 0; i<n_cores; i++) hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*

我正在研究一个库的多线程实现。在这个库的一个模块中有一些全局变量(在程序执行中经常使用)。为了使对这些变量的访问更加安全,我使用线程本地存储(TLS)关键字
\uu declspec(Thread)
声明了它们

下面是对库外部函数的调用。此函数使用具有全局变量的模块:

for(i = 0; i<n_cores; i++)
    hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*)&inputSet[i]);

for(i=0;i),答案是:您需要分析应用程序,并测量花费的时间最多的地方。如果结果是在经常引用TLS数据的函数中,那么“maybe”可能就是答案

即使在您自己编写的代码中,通常也很难找出性能差的原因:在两段短文中描述的程序中远程执行更为困难


配置文件,然后进行优化。

如果您将它们声明为
\uu declspec(thread)
,而它们以前是全局的,那么您已经更改了程序的含义及其性能特征

当变量是全局变量时,每个线程都引用一个副本。作为线程局部变量,每个单独的线程都有自己的变量,对该线程局部变量的更改仅在该线程中可见

假设您确实需要线程局部变量,那么读取和写入线程局部变量的成本确实要比普通变量高。每当您面临需要很长时间才能执行的操作时,最好的解决方案是完全停止执行。在这种情况下,有两种明显的方法可以做到这一点:

  • 将变量作为参数传递,使其驻留在堆栈上。访问堆栈变量很快
  • 如果您的函数经常读写这个变量,那么在函数开始时复制它(到局部变量中),处理该局部变量,然后在返回时将其写回本地线程
  • 在这些选项中,前者通常是首选的。选项2有一个很大的缺点,即如果函数调用另一个使用此变量的函数,则无法轻松应用它

    选项1基本上等于不使用全局变量(线程局部变量是全局变量的一种形式)


    当然,这一切可能完全偏离了主题,因为您对代码实际执行的操作所说的太少。如果您想解决性能问题,首先必须确定它在哪里,这意味着您需要进行测量。

    谢谢您的回答。TLS数据用于非常耗时的一组操作中。但是从你的话中,我明白这个事实不可能是原因。我会发布代码,但太长了,这就是为什么我只是试图简短地描述我的问题。谢谢你,我现在非常确定问题存在于线程本地可变访问时间。我应该试着实现解决方案“1”然后再次测试性能。您是否仍然使用StackOverflow?如果是,也许您可以让我们知道您的结论是什么:您是否使用线程局部变量和不使用线程局部变量来衡量性能?是这样,这有什么区别?还是其他方法解决了问题?