How to allocate thread local storage?

前端 未结 9 1220
夕颜
夕颜 2020-12-07 10:40

I have a variable in my function that is static, but I would like it to be static on a per thread basis.

How can I allocate the memory for my C++ class such that eac

相关标签:
9条回答
  • 2020-12-07 11:18

    On Windows you can use TlsAlloc and TlsFree to allocate storage in the threads local storage.

    To set and retrieve values in with TLS, you can use TlsSetValue and TlsGetValue, respectively

    Here you can see an example on how it would be used.

    0 讨论(0)
  • 2020-12-07 11:19

    boost::thread_specific_ptr is the best way as it portable solution.

    On Linux & GCC you may use __thread modifier.

    So your instance variable will look like:

    static __thread MyClass *instance = new MyClass();
    
    0 讨论(0)
  • 2020-12-07 11:20

    If you're working with MSVC++, you can read Thread Local Storage (TLS)

    And then you can see this example.

    Also, be aware of the Rules and Limitations for TLS

    0 讨论(0)
  • 2020-12-07 11:21

    It is worth noting that C++11 introduces the thread_local keyword.

    Here is an example from Storage duration specifiers:

    #include <iostream>
    #include <string>
    #include <thread>
    #include <mutex>
    
    thread_local unsigned int rage = 1; 
    std::mutex cout_mutex;
    
    void increase_rage(const std::string& thread_name)
    {
        ++rage;
        std::lock_guard<std::mutex> lock(cout_mutex);
        std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
    }
    
    int main()
    {
        std::thread a(increase_rage, "a"), b(increase_rage, "b");
        increase_rage("main");
    
        a.join();
        b.join();
    
        return 0;
    }
    

    Possible output:

    Rage counter for a: 2
    Rage counter for main: 2
    Rage counter for b: 2
    
    0 讨论(0)
  • 2020-12-07 11:21

    If you're using Pthreads you can do the following:

    //declare static data members
    pthread_key_t AnotherClass::key_value;
    pthread_once_t AnotherClass::key_init_once = PTHREAD_ONCE_INIT;
    
    //declare static function
    void AnotherClass::init_key()
    {
        //while you can pass a NULL as the second argument, you 
        //should pass some valid destrutor function that can properly
        //delete a pointer for your MyClass
        pthread_key_create(&key_value, NULL);
    }
    
    void AnotherClass::threadSpecificAction()
    {
      //Initialize the key value
      pthread_once(&key_init_once, init_key);
    
      //this is where the thread-specific pointer is obtained
      //if storage has already been allocated, it won't return NULL
    
      MyClass *instance = NULL;
      if ((instance = (MyClass*)pthread_getspecific(key_value)) == NULL)
      {
        instance = new MyClass;
        pthread_setspecific(key_value, (void*)instance);
      }
    
      instance->doSomething();
    }
    
    0 讨论(0)
  • 2020-12-07 11:23

    Just a side note... MSVC++ supports declspec(thread) from VSC++2005

    #if (_MSC_VER >= 1400)
      #ifndef thread_local     
        #define thread_local __declspec(thread)
      #endif
    #endif
    

    Main problem is(which is solved in boost::thread_specific_ptr) variables marked with it can't contain ctor or dtor.

    0 讨论(0)
提交回复
热议问题