【发布时间】:2011-06-03 06:49:36
【问题描述】:
我正在编写一个快速的多线程程序,我想避免同步(需要同步的函数必须每秒调用 5,000,000 次,所以即使是互斥锁也太重了)。
场景是:我有一个类的单个全局实例,每个线程都可以访问它。为了避免同步,类中的所有数据都是只读访问的,除了一堆类成员,然后在 TLS 中声明(使用 __thread 或 __declspec(thread))。
不幸的是,为了使用编译器提供的 __thread 接口,类成员必须是静态的并且没有构造函数/解构函数。我使用的类当然有自定义构造函数,所以我声明,作为类成员,一个指向该类的指针(类似于 static __thread MyClass* _object)。
然后,当线程第一次从全局实例调用方法时,我会执行类似“(if _object == NULL) object = new MyClass(...)”的操作。
我最大的问题是:有没有一种聪明的方法来释放这个分配的内存?这个全局类来自一个库,它被程序中的许多线程使用,每个线程都以不同的方式创建(即每个线程执行不同的函数),我不能每次都放一段代码线程将终止。 谢谢各位。
【问题讨论】:
-
第一印象是您需要对系统进行设计审查。哪些数据需要共享,哪些数据将被修改,何时发生。
-
不幸的是,我不是从头开始设计系统,但恕我直言,这是实现我的结果的最小干扰方式(就“没有改变接口”而言)
-
你试过
at_exit吗? (不知道卸载库时是否有效) -
Ehehe,这太容易了:-) 我的程序是一种守护进程(便携式 Win32/Linux),所以它基本上不会被杀死,但是线程会不断创建/销毁,并且每个线程创建基本上意味着巨大的内存泄漏。
-
C++11
thread_local似乎是您正在寻找的,除了 gcc-4.8 是我所知道的唯一实现它的编译器。
标签: c++ multithreading synchronization