Pthread Thread-Local-Singleton,什么时候释放TLS Key?

2024-01-15

我使用 pthread TLS 实现了一种“线程本地单例”,我想知道在这种情况下如何(以及何时)删除 pthread_key_t,因为就像现在一样,TLS 密钥使用的内存永远不会释放。 d.

其预期用法是让类 A 从 ThreadLocalSingleton 派生,这使得 A 成为线程本地单例,假设 A 只有私有构造函数并且 ThreadLocalSingleton 是 A 的友元。

哦,还有 - 您是否发现该实施有任何问题?我是否忽略了任何重要的事情?

#include <pthread.h>
#include <iostream>

template <class T>
class ThreadLocalSingleton
{
private:
    static pthread_key_t tlsKey;
    static pthread_once_t tlsKey_once;

    static void tls_make_key()
    {
        (void)pthread_key_create(&ThreadLocalSingleton::tlsKey, ThreadLocalSingleton::tls_destructor);
    }

    static void tls_destructor(void* obj)
    {
        delete ((T*)obj);
        pthread_setspecific(tlsKey, NULL); // necessary or it will call the destructor again.
    }

public:

    /*
     * A thread-local singleton getter, the resulted object must never be released,
     * it is auto-released when the thread exits.
     */
    static T* getThreadInstance(void)
    {
        pthread_once(&tlsKey_once, ThreadLocalSingleton::tls_make_key);
        T* instance = (T*)pthread_getspecific(tlsKey);
        if(!instance)
        {
            try
            {
                instance = new T;
                pthread_setspecific(tlsKey, instance);
            }
            catch (const char* ex)
            {
                printf("Exception during thread local singleton init: %s\n",ex);
            }
        }
        return instance;
    }
};
template <class T>
pthread_key_t ThreadLocalSingleton<T>::tlsKey;
template <class T>
pthread_once_t ThreadLocalSingleton<T>::tlsKey_once = PTHREAD_ONCE_INIT;

您的实现看起来非常优雅。

根据pthread_key_create 的开放组规范 http://pubs.opengroup.org/onlinepubs/009696799/functions/pthread_key_create.html,您不必在析构函数中将引用设置为 NULL:

可选的析构函数可以与每个键值相关联。在线程退出时,如果某个键值具有非 NULL 析构函数指针,并且线程具有与该键关联的非 NULL 值,则该键的值将设置为 NULL,然后使用先前关联的值作为其唯一参数。

我认为这也意味着关键对象本身将被 pthread 自动销毁。您只需要关心密钥后面存储的内容,这正是您的delete ((T*)obj); does.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pthread Thread-Local-Singleton,什么时候释放TLS Key? 的相关文章

  • 在 Linux 上以 root 身份调用 SCHED_FIFO 线程的 pthread_create() 时获取 EPERM

    我试图在 Linux 系统上以 SCHED FIFO 或 SCHED RR 策略作为 root 生成线程 但我对 pthread create 的调用返回 1 EPERM pthread create 的手册页指出 EPERM 指示 调用者
  • @singleton 的行为类似于@stateless bean

    我正在开发一个应用程序 java中的企业应用程序 其中我需要由多个线程同时共享的单个实例 我使用了 singleton 当每个用户登录时 通过调用 setTeleCallersDetails 远程方法在电话呼叫者列表中设置一个值 但在某些时
  • 定义 ADT 时案例对象 T 和案例类 T() 之间的区别?

    假设在 scala 中我有一个 ADT 如下所示 sealed trait Animal object Animal case class Lion name String extends Animal case class Elephan
  • iOS 自毁单例设计模式

    我最近遇到一个问题 其中我只希望特定对象存在一个实例 并且仅存在执行特定操作所需的短暂时间 它的操作是异步的 因此如果我没有保存对它的引用 ARC 会在运行循环结束时释放它 如果我确实保留它 我将需要委托回调或通知来知道何时完成释放它 该对
  • 处理segfault信号SIGSEGV需要使用siginfo_t确定segfault的原因

    我正在为 pthread 库制作一个包装器 它允许每个线程拥有自己的一组非共享内存 现在 如果任何线程尝试读取另一个线程的数据 程序就会出现段错误 这很好 我可以用叹息者抓住它并打电话pthread exit 并继续执行该程序 但并不是所有
  • 我的线程可以帮助操作系统决定何时将其上下文切换吗?

    我正在 Linux 上用 C 开发一个线程应用程序 它试图实现实时 根据心跳执行操作 或者尽可能接近实时 在实践中 我发现操作系统正在交换我的线程 并导致切换时延迟长达十分之一秒 从而导致心跳不规则 有没有一种方法可以让我的线程向操作系统暗
  • 线程本地存储开销

    假设有一些不可重入函数使用全局变量 int i void foo void modify i 然后 我想在多线程代码中使用这个函数 所以我可以这样更改代码 void foo int i modify i 或者 通过使用 gcc thread
  • 编译时 -pthread 标志的含义

    在各种多线程 C 和 C 项目中 我看到了 pthread标志应用于编译和链接阶段 而其他人根本不使用它 只是通过 lpthread到链接阶段 不编译链接有没有危险 pthread标志 即什么 pthread实际上呢 我主要对 Linux
  • 从 pthread 调用 sleep() 是否会使线程或进程进入睡眠状态?

    我看到有一个关于linux pthread睡眠 https stackoverflow com questions 3633089 pthread sleep linux 然而 当我在 Linux 机器上查找手册页时 我看到以下内容 概要
  • 静态变量的线程安全初始化

    我一直在使用这种模式来初始化类中的静态数据 对我来说 它看起来是线程安全的 但我知道线程问题有多么微妙 这是代码 public class MyClass bad code do not use static string myResour
  • pthread_join() 用于异步线程

    我写了一个简单的演示程序 以便我可以理解pthread join 功能 我知道如何使用pthread condition wait 函数允许异步线程 但我试图了解如何使用pthread join 功能 在下面的程序中我通过线程1s ID t
  • 如何在 Objective-C 中调试单例

    我的应用程序包含几个单例 以下是本教程 http cocoawithlove com 2008 11 singletons appdelegates and top level html 然而 我注意到 当应用程序因单例而崩溃时 几乎不可能
  • Dagger 2 - 如何创建/提供 EagerSingleton

    我在使用 Dagger 2 依赖注入框架时遇到问题 我想创建一个渴望单例 我假设当我使用 dagger 2 时会创建延迟加载的单例 Singleton注解 我如何创建渴望单例使用 Dagger 2 框架 我通过创建一个解决了这个问题Eage
  • 如何杀死正在运行的线程? [复制]

    这个问题在这里已经有答案了 可能的重复 杀死 pthread 中的线程 https stackoverflow com questions 2084830 kill thread in pthread 在包含线程启动的源代码之后 过了一会儿
  • 在 Actionscript 3 中实现单例模式类的最佳方法是什么?

    由于 AS3 不允许私有构造函数 因此构造单例并保证构造函数不是通过 new 显式创建的唯一方法是传递单个参数并检查它 我听说过两个建议 一个是检查调用者并确保它是静态 getInstance 另一个是在同一包命名空间中拥有一个私有 内部类
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • 使用多线程的套接字服务器或文件服务器实现:概念不清楚

    请帮我理清这个概念 假设我们有一个使用线程实现的套接字端口服务器 套接字服务器侦听套接字端口 并在消息到达时创建一个线程来服务该请求 客户端代码向服务器发送给定数量的消息 该客户端代码也可以由多个用户在不同的计算机上运行 我知道客户端代码作
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 完成后关闭线程

    完成后如何关闭线程 比如确保没有任何东西再打开或运行 到目前为止我知道如何打开它 但是 不知道如何正确关闭它 int iret1 pthread t thread1 char message1 void multithreading1 vo
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样

随机推荐