static class member vom typ pthread_mutex_t ??



  • Hallo,

    ich schreibe einen multithreaded Server (g++/linux) wobei jede request von einem Server Objekt behandelt wird. Die Server Klasse hat eine statische member Variable vom Typ pthread_mutex_t. Es sieht etwa so aus:

    class Server {
    	...
    	static pthread_mutex_t m_mutex;
    	static void initMutex();
    	void doSomething();
    	...
    };
    
    void Server::initMutex() {
    	pthread_mutex_init(&m_mutex, NULL);
    }
    
    void Server::doSomething() {
    	if (pthread_mutex_lock(&m_mutex) != 0) {
    		...
    	}
    	...
    	if (pthread_mutex_unlock(&m_mutex) != 0) {
    		...
    	}
    }
    
    int main(int argc, char **argv) {
    	Server::initMutex();
    	//auf Port xxx hoeren, fuer jede Request ein Server object in neuem Thread erstellen
    }
    

    Der code wird compiliert, beim Linken bekomme ich jedoch folgende Fehlermeldung (die selbe Fehlermeldung bekomme ich fuer alle Methoden wo auf m_mutex zugegriffen wird):

    server.o(.text+0x32d0): In function `Server::mutexInit()':
    /data1/skola/se2/sync/sync/server.cpp:355: undefined reference to `Server::m_mutex'
    

    Hat irgentjemand eine Idee wo das Problem stecken konnte? Mit scheint es als ob das "static pthread_mutex_t" sich als nur eine deklaration verhalten wurde. Muss ich m_mutex irgentwie initializsieren (pthread_mutex_t ist eine struct).

    Danke, Peter



  • Fehlt in der Implementierungsdatei (*.cpp) vielleicht ein

    pthread_mutex_t Server::m_mutex;
    

    😕



  • Danke, dass hat das Problem geloest!

    Ich verstehe aber nicht, wieso dass in der cpp Datei stehen muss. Wenn ich ein int (auch statisch) in einer Klasse deklariere, so wird es automatisch auch definiert. Wieso ist dies aber nicht der Fall bei einer struct??

    Peter



  • ubu_roi schrieb:

    Wenn ich ein int (auch statisch) in einer Klasse deklariere, so wird es automatisch auch definiert.

    Auch bei ints muß man folgendes machen:

    //Foo.h
    class Foo
    {
    	...
    	private:
    		static const int BAR;
    };
    
    //Foo.cpp
    const int Foo::BAR = 1234;
    

    Läßt du die Deklaration weg, läßt sich das zwar kompilieren, aber auch nur wenn auf die Variable BAR nicht zugegriffen wird. Ansonsten gibt es ein "undefined reference to `Foo::BAR'".

    IMHO.



  • Hmmm ... hast recht ... Thx


Anmelden zum Antworten