thread globale variable oder so aehnlich



  • hola

    gibt es sowas aehnliches wie ne thread globale und thread-static variable ?
    oder kann man sich sowas auch irgendwie zusammen basteln ?
    das ich pro thread nur einmal eine klasseninstanz erstellen kann, jedoch mehrere im prozess ?
    hoffendlich hab ich mich da halb wegs verstaendlich ausgedrueckt

    Meep Meep



  • Evtl. ein Singleton, das als Entscheidungskriterium für die Erstellung einer neuen Instanz die Thread ID verwendet? Nur so als Idee...



  • __declspec(thread)



  • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/k102_8d625992-2e36-464d-a771-629d5f08b398.xml.asp

    Hi !!
    In der obigen adresse findest du eine Funktion die es dir erlaubt eine variable zu erhöhen ohne dass ees ein anderer Thread zur selben Zeit kann.
    Allerdings muss diese Variable in einen speziellen bereich der anwedung geschrieben werden. Wenn du VC verwendest geht das so:

    #pragma push()
    #pragma comment(linker, "/shared")
    long MyVar = 0;
    #pragma pop();
    
    BOOL WINAPI WINMAIN(..)
    {
       InterlockedIncrement(&MyVar);
    
       if (MyVar != 1)
       {
          return FALSE;
       }
    
       while(Running)
       {
         MsgStuff();
         ExecuteProgram();
       }
       InterlockedDecrement(&MyVar);
       return TRUE;
    }
    

    So kann man zum beispiel auf einfache Art und Weise seine anwendung
    zwingen nur einmal zu starten !
    rya.
    Scorcher24



  • re

    @MFK:
    kannst du mir das etwas genaeuer erklaeren, wie das funktioniert ?

    ich zeig mal ein kurzes beispiel was ich da genau machen will:

    class myclass
    {
       ...
       static another_class var; // (1)
       ...
    }
    

    hier hab ich ne klasse, in der ich eine andere klasse verwende, die static deklariert ist. in diesem fall gibt es sie in egal wie vielen myclasses nur einmal. klar. nun moechte ich es so haben, das wenn in einem neuen thread eine myclass benuetzt wird, wieder eine neue instanz von another_class erstelt wird. also pro thread eine instanz von another_class.
    funktioniert das nun so mit __declspec(thread) ? wenn ja, koenntest du mir da ein kleines beispiel zeigen ?

    cermy

    Meep Meep



  • Meep Meep schrieb:

    funktioniert das nun so mit __declspec(thread) ?

    Kommt drauf an, was another_class ist.

    Hier stehen ein paar Einschränkungen:
    http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_the_thread_attribute.asp

    #include <windows.h>
    #include <process.h>
    #include <iostream>
    using namespace std;
    
    class myclass
    {
    	__declspec(thread) static int i;
    public:
    	myclass()
    	{
    		++i;
    		cout << i;
    	}
    };
    
    __declspec(thread) int myclass::i = 0;
    
    unsigned int __stdcall thread(void* p)
    {
    	myclass x;
    	return 0;
    }
    
    int main()
    {
    	for(int i=0; i<10; ++i)
    	{
    		_beginthreadex(0, 0, thread, 0, 0, 0);
    	}
    	Sleep(1000);
    }
    

    ...ergibt 1111111111, ohne __declspec(thread) 12345678910.





  • danke euch mal. werd das zeugs jetz mal durch nehmen

    Meep Meep



  • re

    kleines problemchen hab ich nun

    hab folgenden code:

    class buffer
    {
       public:
          buffer(void) { }
          ~buffer(void) { }
    }; /* stark vereinfacht. nur um zu zeigen, das mit ctor nix gemacht werden kann */
    
    class myclass
    {
       ...
       public:
          __declspec(thread) static buffer thread_buffer;
          ...
    };
    
    __declspec(thread) buffer myclass::thread_buffer(); (1)
    

    beim kompilieren kommt dann:

    'myclass::thread_buffer' muss zur laufzeit initialisiert/finalisiert werden
    

    wie geht das nun richtig ?

    Meep Meep


Anmelden zum Antworten