我正在编写一个快速的多线程程序,希望避免同步(需要同步的函数每秒调用大约500万次,因此即使使用互斥锁也过于沉重)。
场景如下:我拥有一个单一的全局类实例,每个线程都可以访问它。为了避免同步,除了一些类成员之外所有类中的数据都是只读的,并且这些成员被声明在TLS中(__thread或者__declspec(thread))。
不幸的是,为了使用编译器提供的__thread接口,这些类成员必须是静态的且没有构造函数/析构函数。我使用的类当然有自定义的构造函数,因此我将指向这些类的指针(类似于static __thread MyClass* _object)声明为类成员。
然后,当第一个线程从全局实例调用一个方法时,我会执行类似于“(if _object == NULL) object = new MyClass(...)”这样的操作。
我的最大问题是:有没有明智的方法来释放这个分配的内存?这个全局类是从一个库中获取的,程序中许多线程都在使用它,每个线程以不同的方式创建(即每个线程执行不同的函数),我无法每次线程终止时都放置代码片段。
谢谢各位。
at_exit
吗?(不确定在卸载库时是否有效) - Matthieu M.thread_local
似乎是您正在寻找的,但我知道只有gcc-4.8实现了它。 - Marc Glisse--enable-tls
即可。 - VF1