zoukankan      html  css  js  c++  java
  • caffe可重入单例机制分析

    一个函数可重入是指该函数可以被多个线程同时调用。大多数函数都不是可重如的,因为很多函数会修改静态数据结构里的内容,如果多个线程同时调用,势必破坏共享的静态结构。可以在不改变公共接口的情况下,将一个非重入函数修改为可重入函数。思想是使用线程的本地存储来实现,而boost::thread_specific_ptr正好提供了使用TLS(thread local storage)的机制。

    在caffe框架中,class Caffe是一个单例类,这个类是可以重入的,即可以被多个线程同时使用:

    image

    进入到上图109行的Get()函数:

    image

    这个函数是一个static的函数,它的返回值是Caffe对象的引用,第13行定义了一个指向Caffe对象的智能指针,类型为boost::thread_specific_ptr<Caffe>.代码的16行首先判断thread_instance_智能指针指向的对象是否为空,如果为空则说明进入到这个函数的线程是第一次运行这个函数,那么就执行17行,重新new一个caffe对象,这个对象是属于该线程独有的,存放在该线程的TLS(Thread local storage)中。如果thread_instance_智能指针指向的对象不为空,说明进入到这个函数的线程已经不是第一次运行到这行代码了,那么就直接将自己TLS中的Caffe对象拿来使用就行了。boost::thread_specific_ptr中Get()函数的定义如下图82行所示:

    image

    这个函数其实就是返回线程私有存储空间中的对象而已。

    可以用下面的示例代码来验证boost::thread_specific_ptr的机制:

    #include <iostream>
    #include <boost/thread/mutex.hpp>
    #include <boost/thread/thread.hpp>
    #include <boost/thread/tss.hpp>
    
    boost::mutex io_mutex;
    boost::thread_specific_ptr<int> ptr;
    
    struct count{
        count(int id) : id(id) {  }
        void operator()(){
            if(ptr.get() == 0){
                ptr.reset(new int(0));
            }
            for(int i = 0; i < 10; i++) {
                (*ptr)++;
                boost::mutex::scoped_lock lock(io_mutex);
                std::cout << id << ": " << *ptr << std::endl;
            }
        }
        int id;
    
    };
    
    int main() {
        boost::thread thrd1(count(1));
        boost::thread thrd2(count(2));
        thrd1.join();
        thrd2.join();
        return 0;
    }

        这段代码声明了一个指向int类型的智能指针,main函数中使用了两个线程来访问该ptr,每个线程都会对ptr指向的值执行加法操作,从输出结果可以看到,两个线程的值互不干扰:

    image

    该代码采用cmake编写,完整的工程项目点击这里

  • 相关阅读:
    http/ip 协议
    shell脚本
    LoadRunner脚本编写
    【WebGL】《WebGL编程指南》读书笔记——第6章
    【WebGL】《WebGL编程指南》读书笔记——第5章
    【WebGL】《WebGL编程指南》读书笔记——第4章
    【WebGL】《WebGL编程指南》读书笔记——第3章
    【WebGL】《WebGL编程指南》读书笔记——第2章
    【移动支付】.NET微信扫码支付接入(模式二-NATIVE)
    【学车】学车笔记-科目二
  • 原文地址:https://www.cnblogs.com/justinzhang/p/9013886.html
Copyright © 2011-2022 走看看