首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C-__declspec(线程)变量性能

C-__declspec(线程)变量性能
EN

Stack Overflow用户
提问于 2011-02-22 10:18:48
回答 2查看 2.1K关注 0票数 5

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(i = 0; i<n_cores; i++)
    hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*)&inputSet[i]);

通过这种方式,我猜库中使用的所有变量都将为每个线程复制。

当我在x8核心处理器上运行程序时,完成操作所需的时间不会超过单进程实现所需时间的1/3。

我知道达到1/8的时间是不可能的,但我认为至少有1/6是可以达到的。

问题是:这些__declspec(thread)变量是导致性能如此糟糕的原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 10:57:31

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

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

假设你真的想要线程局部变量,那么读写线程局部变量确实比普通变量更昂贵。每当你面对一个需要很长时间执行的操作时,最好的解决方案就是完全停止它。在这种情况下,有两种显而易见的方法:

  1. 将变量作为参数传递,以便它驻留在堆栈中。访问堆栈变量很快。
  2. 如果您的函数经常读写此变量,则在函数开头将其复制(放入局部变量中),处理该局部变量,然后在返回时将其写回线程本地。

在这些选项中,前者通常是首选的。选项2有一个很大的缺点,那就是如果函数调用另一个使用此变量的函数,就不能轻松地应用它。

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

当然,这一切都可能完全离谱,因为你对你的代码实际做的事情说得太少了。如果你想解决一个性能问题,你首先必须确定它在哪里,这意味着你需要测量。

票数 6
EN

Stack Overflow用户

发布于 2011-02-22 10:23:57

答案是:您需要分析应用程序,并测量花费时间最多的地方。如果它被证明是在经常引用TLS数据的函数中,那么“也许”可能是答案。

通常,即使是在自己编写的代码中,也很难找出性能不佳的原因:在两个简短段落中描述的程序中远程找出原因就更难了。

配置文件,然后优化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5076853

复制
相关文章
多线程-互斥变量
第一个 CreateMutex 函数功能:创建互斥量(注意与事件Event的创建函数对比) 函数原型: HANDLE  CreateMutex(   LPSECURITY_ATTRIBUTESlpMutexAttributes,   BOOLbInitialOwner,        LPCTSTRlpName ); 函数说明: 第一个参数表示安全控制,一般直接传入NULL。 第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线
用户1624346
2018/04/18
8340
变量的线程安全分析
每个线程调用 test1() 方法时局部变量 i,会在每个线程的栈帧内存中被创建多份,因此不存在共享
一个风轻云淡
2023/10/15
2460
变量的线程安全分析
Java 多线程系列(5) —— 线程本地变量
在集成 Thread 类或实现 Runnable 接口时,不同线程中的数据共享是必要的。 【示例】
求和小熊猫
2020/12/09
2890
Java 多线程系列(5) —— 线程本地变量
Java线程(篇外篇):线程本地变量ThreadLocal
该文介绍了Java线程的本地方法,包括ThreadLocal的使用、原理、实现和注意事项。ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。使用ThreadLocal需要注意线程安全问题,同时需要考虑ThreadLocal的缺省值和自定义值等细节问题。
高爽
2017/12/28
1.1K0
线程同步(二)—— 条件变量
上篇提到线程针对临界值操作时需要加锁,但是线程访问临界资源只通过锁来控制是不够的。 比如对一个数据进行操作,A线程需要读,B线程进行写。 A线程先访问临界资源,发现没有数据可以读,只能等待B线程先写,此时又占用了互斥锁,导致B线程无法得到锁,进行写操作。 此时就需要用到条件变量了,条件变量的目的就是控制线程的先后执行,保证临界资源的有效性。 下面依然是售票的一个场景,此时一个线程售票,一个线程退票。 #include <pthread.h> #include <unistd.h>
Aichen
2018/05/18
9920
Java多线程:条件变量
条件变量将因不同条件而无法推进的线程分别阻塞在不同的条件队列上,可以精细控制线程同步,降低惊群效应。
冰寒火
2023/02/18
8130
Java ThreadLocal 线程本地变量
ThreadLocal的功能在Java多线程并发环境中非常实用,其作用是提供线程本地变量,例如用户ID、会话ID等与当前线程密切关联的信息。
zhipingChen
2019/01/02
5920
Python 多线程 - 共享变量
从上面两个线程执行的结果来看,线程t1将 g_num 加到 103,在线程t2也是打印g_num=103。所以对于两个线程,g_num这个全局变量是共享的。
Devops海洋的渔夫
2019/05/31
2.6K0
linux线程-sysconf系统变量
了解系统的线程资源限制是使得应用程序恰当地管理它们的关键。前面已经讨论了利用系统资源的示例。当设置线程的栈大小时,最小值为PTHREAD_MIN_STACK。栈大小不应当低于由pthread_attr_getstacksize( )返回的默认栈大小的最小值。每个进程的最大线程数决定了能够为每个进程创建的worker线程的上限。函数sysconf( )用于返回可配置系统限制或选项的当前值。系统中定义了同线程、进程和信号量相关的多个变量和常量。在表6-8中,列出了部分变量和常量。
阳光岛主
2019/02/19
1.1K0
python 线程条件变量Condition
对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.
猿说编程[Python和C]
2020/03/07
9670
python 线程条件变量Condition
Spark 性能常规性能调优广播大变量
默认情况下,task中的算子中如果使用了外部的变量,每个task都会获取一份变量的复本,这就造成了内存的极大消耗。一方面,如果后续对RDD进行持久化,可能就无法将RDD数据存入内存,只能写入磁盘,磁盘IO将会严重消耗性能;另一方面,task在创建对象的时候,也许会发现堆内存无法存放新创建的对象,这就会导致频繁的GC,GC会导致工作线程停止,进而导致Spark暂停工作一段时间,严重影响Spark性能。
程序狗
2021/09/16
2830
Spark 性能常规性能调优广播大变量
python 线程 性能比较
class threads_object(Thread): def run(self): function_to_run()
用户5760343
2022/05/13
5490
Android 性能优化:多线程
本文介绍了 Android 开发中多线程的必要性以及一些基础概念。Android 系统为我们提供了几种工具类来实现多线程,包括 AsyncTask、HandlerThread、ThreadPool 和 IntentService。这些工具类可以帮助我们在合适的时候选择合适的线程,优化应用的性能。同时,为了避免过度复杂的线程安全问题,Android 系统规定只能在主线程中更新 UI。
张拭心 shixinzhang
2018/01/05
1.2K0
Android 性能优化:多线程
聊聊reactor异步线程的变量传递
在传统的请求/应答同步模式中,使用threadlocal来传递上下文变量是非常方便的,可以省得在每个方法参数添加公用的变量,比如当前登录用户。但是业务方法可能使用了async或者在其他线程池中异步执行,这个时候threadlocal的作用就失效了。
code4it
2018/09/17
3.3K0
31.python 线程条件变量Condition
对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.
猿说编程[Python和C]
2020/03/12
1.8K0
31.python 线程条件变量Condition
【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )
② 声明线程 ID : 线程 ID 类型是 pthread_t 类型的 , 其本质是 int 类型 ;
韩曙亮
2023/03/27
1.3K0
【C++ 语言】线程安全队列  ( 条件变量 | 线程调度 )
UNIX(多线程):16---条件变量
std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了与条件变量相关的功能, Windows 则参考 MSDN。
用户3479834
2021/02/03
5750
Java多线程:神秘的线程变量 ThreadLocal 你了解吗?
前言 在 Java多线程中,线程变量ThreadLocal非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 ThreadLocal的介绍 & 实战攻略,希望你们会喜
Carson.Ho
2019/02/22
5020
线程本地变量,你只会ThreadLocal吗?
代码@3:如果线程对象的threadLocals属性不为空,则从该Map结构中,用threadLocal对象为键去查找值,如果能找到,则返回其value值,否则执行代码@4。
Bug开发工程师
2019/08/02
1.9K0
点击加载更多

相似问题

使用共享变量的Perl线程性能

20

lib线程:单线程性能与多线程性能

27

多线程性能

20

多线程性能

20

线程开销性能

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文