Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using QThreadStorage in any thread
QtWS25 Last Chance

Using QThreadStorage in any thread

Scheduled Pinned Locked Moved Solved General and Desktop
9 Posts 3 Posters 982 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    chopper
    wrote on last edited by
    #1

    I presume that it is safe to use on any operating system thread as Qt likely relies on the underlying platform support for TLS. (I.e., it doesn't have to be used on threads spawned via QThread.)

    Is that correct?

    Thanks!

    jsulmJ 1 Reply Last reply
    0
    • C chopper

      I presume that it is safe to use on any operating system thread as Qt likely relies on the underlying platform support for TLS. (I.e., it doesn't have to be used on threads spawned via QThread.)

      Is that correct?

      Thanks!

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @chopper Yes, as long as the operating system supports threads you can use them via QThread.
      What do you mean by TLS in this context?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • C Offline
        C Offline
        chopper
        wrote on last edited by
        #3

        Thread Local Storage (as opposed to Transport Layer Security ;) )

        Thx!

        This lets me create a QNetworkAccessManager allocator that returns an instance per thread and store that in a map of <threadID,QNAM*>, and because of QThreadStorage I can mark the thread and avoid the situation where a new thread reuses an old thread ID (Qt::HANDLE) and would otherwise get back a QNAM built for a different thread,

        1 Reply Last reply
        0
        • C Offline
          C Offline
          chopper
          wrote on last edited by
          #4

          I thought I would double check, it turns out that's not correct @jsulm :

          From qthreadstorage.cpp

          void **QThreadStorageData::set(void *p)
          {
              QThreadData *data = QThreadData::current();
              if (!data) {
                  qWarning("QThreadStorage::set: QThreadStorage can only be used with threads started with QThread");
                  return 0;
              }
          
          1 Reply Last reply
          0
          • C Offline
            C Offline
            chopper
            wrote on last edited by
            #5

            I'm trying, and testing, the following (requires C++ 11)

            thread_local std::unique_ptr<QNetworkAccessManager> tls_pQNetworkAccessManager;
            
            QNetworkAccessManager *getQNetworkAccessManager( void )
            {
            	if( nullptr == tls_pQNetworkAccessManager )
            	{
            		tls_pQNetworkAccessManager.reset( new QNetworkAccessManager() );
            	}
            
            	return tls_pQNetworkAccessManager.get();
            }
            
            jsulmJ 1 Reply Last reply
            0
            • C chopper

              I'm trying, and testing, the following (requires C++ 11)

              thread_local std::unique_ptr<QNetworkAccessManager> tls_pQNetworkAccessManager;
              
              QNetworkAccessManager *getQNetworkAccessManager( void )
              {
              	if( nullptr == tls_pQNetworkAccessManager )
              	{
              		tls_pQNetworkAccessManager.reset( new QNetworkAccessManager() );
              	}
              
              	return tls_pQNetworkAccessManager.get();
              }
              
              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @chopper Do you really need one QNetworkAccessManager instance per thread?

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • C Offline
                C Offline
                chopper
                wrote on last edited by
                #7

                Yes, this is utility code that could be used by any number of threads, and sharing a QNAM between threads requires forcing requests onto another thread - which is a potentially huge performance issue.

                1 Reply Last reply
                0
                • G Offline
                  G Offline
                  Grove
                  wrote on last edited by Grove
                  #8

                  @chopper said in Using QThreadStorage in any thread:

                  std

                  How did you implemented the TLS?

                  C 1 Reply Last reply
                  0
                  • G Grove

                    @chopper said in Using QThreadStorage in any thread:

                    std

                    How did you implemented the TLS?

                    C Offline
                    C Offline
                    chopper
                    wrote on last edited by
                    #9

                    @Grove
                    Via C++ 11 support:

                    thread_local std::unique_ptr<QNetworkAccessManager> tls_pQNetworkAccessManager;
                    
                    QNetworkAccessManager *getQNetworkAccessManager( void )
                    {
                    	if( nullptr == tls_pQNetworkAccessManager )
                    	{
                    		tls_pQNetworkAccessManager.reset( new QNetworkAccessManager() );
                    	}
                    
                    	return tls_pQNetworkAccessManager.get();
                    }
                    
                    1 Reply Last reply
                    0

                    • Login

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • Users
                    • Groups
                    • Search
                    • Get Qt Extensions
                    • Unsolved