`
kongweile
  • 浏览: 517285 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Thread-Specific Data 注:相当于线程内的全局变量,可减少线程内调用其他函数的变量数

 
阅读更多

Linux多线程编程中引入了Thread-Specific Data(线程相关的数据)的概念 
  为什么需要"线程相关的数据"呢?怎样使用"线程相关的数据"呢? 
  1. 为什么需要Thread-Specific Data "线程相关的数据" 
  例子:实现同时运行两个线程,对于每个线程,在该线程调用的每个函数中打印线程的名字,以及它正在调用的函数的名字. 
  不使用"线程相关的数据"的两种实现方法: 
  实现方法1. 不使用全局变量 
  #include 
  #include 
  #defineMAXLENGTH 20 
  voidanother_func (constchar*threadName) 
  { 
  printf("%s is running in another_func/n",threadName) 
  } 
  void*thread_func (void*args) 
  { 
  charthreadName[MAXLENGTH] 
  strncpy(threadName,(char*)args,MAXLENGTH-1) 
   
  printf("%s is running in thread_func/n",threadName) 
  another_func (threadName) 
   
  } 
  intmain (intargc,char*argv[]) 
  { 
  pthread_tpa,pb 
  pthread_create(&pa,NULL,thread_func,"Thread A") 
  pthread_create(&pb,NULL,thread_func,"Thread B") 
  pthread_join(pa,NULL) 
  pthread_join(pb,NULL) 
  } 
  输出结果为: 
  Thread A is running in thread_func 
  Thread A is running in another_func 
  Thread B is running in thread_func 
  Thread B is running in another_func 
  该方法的缺点是:由于要记录是哪一个线程在调用函数,每个函数需要一个额外的参数来 
  记录线程的名字,例如another_func函数需要一个threadName参数 
  如果调用的函数多了,则每一个都需要一个这样的参数实现方法2. 使用全局变量 
  #include 
  #include 
  #defineMAXLENGTH 20 
  charthreadName[MAXLENGTH] 
  pthread_mutex_tsharedMutex=PTHREAD_MUTEX_INITIALIZER 
  voidanother_func () 
  { 
  printf("%s is running in another_func/n",threadName) 
  } 
  void*thread_func (void*args) 
  { 
  pthread_mutex_lock(&sharedMutex) 
  strncpy(threadName,(char*)args,MAXLENGTH-1) 
  printf("%s is running in thread_func/n",threadName) 
  another_func () 
  pthread_mutex_unlock(&sharedMutex) 
   
  } 
  intmain (intargc,char*argv[]) 
  { 
  pthread_tpa,pb 
  pthread_create(&pa,NULL,thread_func,"Thread A") 
  pthread_create(&pb,NULL,thread_func,"Thread B") 
  pthread_join(pa,NULL) 
  pthread_join(pb,NULL) 
  } 
  该方法的缺点是:由于多个线程需要读写全局变量threadName,就需要使用互斥机制 
  分析以上两种实现方法,Thread-Specific Data "线程相关的数据"的一个好处就体现出来了: 
  (1)"线程相关的数据"可以是一个全局变量,并且 
  (2)每个线程存取的"线程相关的数据"是相互独立的. 
  2. 怎样使用"线程相关的数据"这是利用"线程相关的数据"的实现方式: 
  #include 
  #include 
  pthread_key_tp_key 
  voidanother_func () 
  { 
  printf("%s is running in another_func/n",(char*)pthread_getspecific(p_key)) 
  } 
  void*thread_func (void*args) 
  { 
  pthread_setspecific(p_key,args) 
  printf("%s is running in thread_func/n",(char*)pthread_getspecific(p_key)) 
  another_func () 
   
  } 
  intmain (intargc,char*argv[]) 
  { 
  pthread_tpa,pb 
  pthread_key_create(&p_key,NULL) 
   
  pthread_create(&pa,NULL,thread_func,"Thread A") 
  pthread_create(&pb,NULL,thread_func,"Thread B") 
  pthread_join(pa,NULL) 
  pthread_join(pb,NULL) 
  } 
  说明: 
  (1) 
  线程A, B共用了p_key, 
  通过p_key,就可以存取只跟当前线程相关的一个值(这个值由编译器管理) 
  线程A----->p_key----->线程A相关的值(由编译器管理) 
  线程B----->p_key----->线程B相关的值(由编译器管理) 
  设置"线程相关的数据",使用 
  int pthread_setspecific(pthread_key_t key, const void *pointer); 
  读取"线程相关的数据",使用 
  void * pthread_getspecific(pthread_key_t key); 
  注意到,这两个函数分别有一个void类型的指针,我们的线程就是通过这两个指针分别与 
  "线程相关的数据"的数据进行交互的 
  (2) 

分享到:
评论

相关推荐

    [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]

    - TLS允许每个线程拥有独立的数据副本,避免了在多线程环境中使用全局变量可能导致的数据竞争问题。 - TLS通常用于存储线程特定的数据,例如,每个线程的数据库连接、日志句柄等,确保数据只被当前线程访问。 2. ...

    线程特定数据linux

    ### 线程特定数据(Thread-Specific Data, TSD)在Linux下的应用 #### 一、背景介绍 在多线程编程环境下,全局变量和静态变量的使用常常会导致不可预知的结果,尤其是在多线程并发访问的情况下。这是因为全局变量...

    LINUX线程函数大全[定义].pdf

    这篇"LINUX线程函数大全[定义].pdf"文档详细介绍了在Linux环境下进行线程操作的关键函数,包括线程创建、线程等待、线程分离以及线程特定数据(Thread Specific Data, TSD)的管理。 首先,线程的创建是通过`...

    AS/400-多线程编程技术.pdf

    ##### 4.3 线程的特有数据(Thread Specific Data) 线程特有数据是指每个线程拥有独立的数据副本,不会被其他线程访问,可以提高程序的效率。 ##### 4.4 调用不具备线程安全性的函数 如果必须调用不具备线程安全性...

    posix多线程编程

    线程特定数据(Thread-Specific Data,TSD)使得每个线程可以拥有自己的数据空间,避免了全局变量的共享问题。 ### 六、线程取消与终止 #### 1. 取消线程 通过`pthread_cancel()`函数可以请求取消线程。 #### 2. ...

    POSIX多线程编程入门[英]

    8. **编写多线程代码**:在Solaris上编写多线程代码,除了使用pthread API外,还需要注意Solaris特有的线程特性,如thread-specific data(线程特定数据)和thread attributes(线程属性)。 通过阅读...

    Posix线程编程指南

    线程私有数据(Thread-Specific Data, TSD)是每个线程可以访问的数据区域,这些数据对于每个线程都是独立的。使用TSD可以有效地避免全局变量带来的竞态条件问题。 1. **概念及作用**:线程私有数据允许每个线程...

    多线程编程指南

    **为线程特定数据创建键**:线程特定数据(Thread-Specific Data,TSD)允许每个线程拥有自己的数据副本,从而避免了线程间的竞争。 **删除线程特定数据键**:当不再需要线程特定数据时,应及时删除对应的键,释放...

    linux_下多线程编程 C语言

    #### 二、线程数据(Thread-Specific Data, TSD) 在多线程环境中,除了传统的全局变量和局部变量之外,还存在一种特殊类型的变量——线程数据(TSD)。这类数据对于每个线程都是独立的,即每个线程都有自己的TSD...

    pthreadcodepthreadcodepthreadcodepthreadcode

    - **线程间信号(Thread-specific Data)**:`pthread_key_t`允许为每个线程创建局部数据,即使在多线程环境中也能保证数据的独立性。 7. **线程调度**:`pthread`库提供了一些函数来控制线程调度,如`pthread_...

    多线程编程技术《Programming Multithreaded applications

    ##### 线程的特有数据(thread specific data) 线程特有数据是指在线程中局部存储的数据,可以在每个线程中拥有独立的副本。 ##### 调用不具备线程安全性的函数 在多线程环境中调用不具备线程安全性的函数时,需要...

    来自IBM的(POSIX).

    **4.3 线程的特有数据(Thread Specific Data)** 每一线程拥有自己的特定数据区域,用于存储线程私有数据。 **4.4 调用不具备线程安全性的函数** 当必须调用非线程安全的函数时,需要采取额外措施确保线程安全。 ##...

    android TLS

    这种存储方式确保了每个线程都有自己的数据副本,避免了传统全局变量在并发访问时可能出现的竞态条件和同步问题。在Android的JNI(Java Native Interface)环境下,开发者可以利用pthread库提供的TLS功能来实现这一...

Global site tag (gtag.js) - Google Analytics