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 ausgedruecktMeep Meep
-
Evtl. ein Singleton, das als Entscheidungskriterium für die Erstellung einer neuen Instanz die Thread ID verwendet? Nur so als Idee...
-
__declspec(thread)
-
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 werdenwie geht das nun richtig ?
Meep Meep