`
run_xiao
  • 浏览: 194915 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux C中也有“ThreadLocal”

    博客分类:
  • Java
阅读更多
现在在看Linux开发的书,接触到了多线程开发这一块,惊奇的发现用C写多线程程序,也有线程

内部变量的概念呢,甚至调用的接口和Java中的ThreadLocal非常像。

 1.
 extern int pthread_key_create ((pthread_key_t *__key, void (*__destr_function) (void *)));
  先使用该方法创建一个线程内的Key,且绑定一个函数在线程结束时回收Key对于的空间

2.
  extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));
  将线程数据和一个键绑定在一起

3.extern void *pthread_getspecific __P ((pthread_key_t __key));
  获得线程数据

4.pthread_key_delete
  删除Key及其对应的线程数据

看来编程语言都是相通的,果真不假啊
分享到:
评论
12 楼 七猫 2008-07-09  
int pthread_setspecific(pthread_key_t key, const void * pointer)
{
  pthread_descr self = thread_self();
  unsigned int idx1st, idx2nd;

  if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use)
    return EINVAL;
  idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
  idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
  if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL) {
    void *newp = calloc(PTHREAD_KEY_2NDLEVEL_SIZE, sizeof (void *));
    if (newp == NULL)
      return ENOMEM;
    THREAD_SETMEM_NC(self, p_specific[idx1st], newp);
  }
  THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd] = (void *) pointer;
  return 0;
}

这是一个大概的实现,
pthread_descr self = thread_self();
这里基本上就是取得线程的私有化数据。
至于其他语言的,WIN平台上的实现就不用提了,基本上是调WINAPI,linux平台上的实现基本上是调用pthread来实现的。pthread调用了不少的系统API来实现这一点。

当然,语言本身也可以进行一定的模拟。
11 楼 七猫 2008-07-09  
这里面主要是fs这个后来引入的寄存器造成的。
linux有关nptl的设计文档里提到了这一点。
10 楼 七猫 2008-07-09  
这个东东有一定的历史,说起来话长,
高效TLS的设计在以前硬件不支持的时候比较麻烦,
后来专门有线程寄存器来做这个事情。
看这段代码
static inline struct _TEB * NtCurrentTeb(void)
{
struct _TEB * pTeb;
__asm mov eax, fs:0x18
__asm mov pTeb, eax
return pTeb;
}
这里存放的是每个线程的数据,

最早以前的实现可能是放一个映射表,切换线程的时候来查找。
要不你得根据TID来自己进行TLS的数据查找,显然效率不快。其实也不能完全说硬件支持,但软件支持的TLS效率显示不高。
9 楼 fredzhang 2008-07-05  
刚刚看到boost::asio里有一段用posix API 来实现thread specific storage的代码,当然win API 也是一样
template <typename T>
class posix_tss_ptr  : private noncopyable
{
public:
  // Constructor.
  posix_tss_ptr()
  {
    int error = ::pthread_key_create(&tss_key_, 0);
    if (error != 0)
    {
      asio::system_error e(
          asio::error_code(error,
            asio::error::get_system_category()),
          "tss");
      boost::throw_exception(e);
    }
  }

  // Destructor.
  ~posix_tss_ptr()
  {
    ::pthread_key_delete(tss_key_);
  }

  // Get the value.
  operator T*() const
  {
    return static_cast<T*>(::pthread_getspecific(tss_key_));
  }

  // Set the value.
  void operator=(T* value)
  {
    ::pthread_setspecific(tss_key_, value);
  }

private:
  // Thread-specific storage to allow unlocked access to determine whether a
  // thread is a member of the pool.
  pthread_key_t tss_key_;
};
8 楼 fredzhang 2008-07-05  
这个东西属于thread specific storage设计模式,在schimdt的POSA volumn 2 中专门有提及,在schimdt的主页也有该paper下,因此不限于语言
7 楼 ray_linn 2008-07-03  
java在linux中是GreenThread而不是OS Thread吧?
6 楼 liusong1111 2008-07-03  
ruby也有.
引用
Thread#[]

Attribute Reference---Returns the value of a thread-local variable
using either a symbol or a string name. If the specified variable
does not exist, returns +nil+.

比如
Thread.current[:name] = "B"


七猫 写道
这是操作系统支持的,非编程语言支持。

证据是?
5 楼 七猫 2008-07-03  
这是操作系统支持的,非编程语言支持。
4 楼 zgd 2008-07-02  
threadlocal只是一个用thread id做key的hashmap而已
3 楼 csf178 2008-06-23  
那是系统调用啊
Java只能在支持多线程的操作系统中多线程 嘿嘿
2 楼 jjcang 2008-06-23  
到,这个是os决定的,和语言有什么关系?
1 楼 qiezi 2008-05-30  
也可以利用编译器扩展,VC里面有一个,关键字我忘了,gcc里面有__thread。

相关推荐

    jdk-17.0.8(jdk-17-linux-x64-bin.tar.gz)

    4. **线程局部变量弱引用(ThreadLocal WeakReferences)**:这允许开发者创建线程局部变量,当不再有强引用指向它们时,它们会被垃圾收集,从而避免内存泄漏。 5. **ZGC(Z Garbage Collector)的优化**:ZGC是一...

    java c开发测试相关的面试题

    通过复习这些知识点,开发者可以对Java、C语言以及Linux有更深入的理解,提高自己在面试中的竞争力。同时,对于测试工程师来说,这些基础知识也是必不可少的,因为理解代码原理有助于找出潜在的bug和优化方案。

    Java个人简历模板12.doc

    5. **框架应用**:开发者熟练使用Struts1、Hibernate、Spring框架,对Struts2、iBatis、Tapestry、JSF等也有一定了解和应用。这显示了其在开发企业级应用时,能够灵活选择和使用合适的框架。 6. **数据库技术**:...

    外文资料java

    标题中的“外文资料java”表明这是一些关于Java编程的外文学习资源,而描述中列举了两个PDF文件,分别是“sun_javaee_tutorial6.pdf”和“Java application development on linux.pdf”,这些文件通常包含了Java开发...

    java程序员简历模版.doc

    6. **ThreadLocal模式**:在多线程环境中,ThreadLocal提供了线程局部变量,每个线程都有自己的副本,避免了共享状态带来的并发问题。 7. **JBOSS JBPM工作流引擎**:用于流程管理,支持业务流程自动化。 8. **EJB...

    java程序员简历模版

    6. **ThreadLocal模式**:ThreadLocal是Java中的一个类,用于在多线程环境下为每个线程提供独立的变量副本,避免了线程安全问题。 7. **EJB(Enterprise JavaBeans)3.0**:EJB是Java EE的一部分,提供了服务器端...

    Python3-廖雪峰 高清完整PDF版

    Python是一种广泛使用的高级编程语言,其设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来定义代码块,而不是使用大括号或关键字)。...无论是初学者还是有经验的开发者,都能够从Python社区中获得帮助。

    Python2.7学习文档

    - 用于在Python中处理C结构体数据。 - **hashlib**: - 提供了多种加密算法,如MD5、SHA1等。 - **itertools**: - 包含了大量的迭代器工具函数。 - **XML**: - 处理XML文档的标准库。 - **HTMLParser**: - 解析...

    java面试题及技巧4

    │ c.gif │ Counter │ counter.gif │ Desktop_.ini │ d_office_photo.html │ end02.gif │ end03.gif │ endin.htm │ feedback.htm │ peizhi1.gif │ Photoshopa.gif │ school.jpg │ schoolzt.gif │ ...

    java面试题以及技巧

    │ c.gif │ Counter │ counter.gif │ Desktop_.ini │ d_office_photo.html │ end02.gif │ end03.gif │ endin.htm │ feedback.htm │ peizhi1.gif │ Photoshopa.gif │ school.jpg │ schoolzt.gif │ ...

    java面试题目与技巧1

    │ c.gif │ Counter │ counter.gif │ Desktop_.ini │ d_office_photo.html │ end02.gif │ end03.gif │ endin.htm │ feedback.htm │ peizhi1.gif │ Photoshopa.gif │ school.jpg │ schoolzt.gif │ ...

    java面试题及技巧3

    │ c.gif │ Counter │ counter.gif │ Desktop_.ini │ d_office_photo.html │ end02.gif │ end03.gif │ endin.htm │ feedback.htm │ peizhi1.gif │ Photoshopa.gif │ school.jpg │ schoolzt.gif │ ...

    java面试题以及技巧6

    │ c.gif │ Counter │ counter.gif │ Desktop_.ini │ d_office_photo.html │ end02.gif │ end03.gif │ endin.htm │ feedback.htm │ peizhi1.gif │ Photoshopa.gif │ school.jpg │ schoolzt.gif │ ...

    J2EE武功秘籍

    - **ThreadLocal**:提供线程本地变量,每个线程都有自己的副本,避免了多线程环境下的线程安全问题。 **14. override(覆盖), overload(重载) 和 overwrite(重写)** - **Override**:子类覆盖父类的方法。 - **...

    Python3-廖雪峰[带标签完整版]

    - **安装方式**:可通过官网下载最新版本的 Python 安装包进行安装,支持 Windows、macOS 和 Linux 多种操作系统。 - **环境变量配置**:为确保在命令行工具中可以全局使用 Python,需将 Python 的安装路径添加到...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段31讲、如何给你的应用程序注入钩子程序,Linux下演示.mp4 │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段31讲、如何给你的应用程序注入钩子程序,Linux下演示.mp4 │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高...

Global site tag (gtag.js) - Google Analytics