2016-11-05 2 views
-1

Ich bekomme einen Fehler auf Mac OS X 10.12 mit Clang, und es möchte nicht meinen Code kompilieren. Ich möchte es über den Compiler kompilieren, aber es beharrt mich mit "Fehler: Member Initialisierer" pthread_mutex_init 'nicht eine nicht statische Daten Mitglied oder Basisklasse "beim Aufrufen von Pthread_mutex_init. Ich habe versucht, "statisch" vor der Erklärung pthread_mutex_t hinzufügen und entfernen, und ich habe bereits meine Pthread Header-Datei enthaltenC++ Mac OS X Pthread Initialisierung

EDIT: ja, ich file.h in meine Datei Datei.cpp enthalten. EDIT # 2: Ich habe versucht Mutex_ = (Mutex_pthread_t) PTHREAD_MUTEX_INITIALIZER und es gibt einige seltsame Fehler, die mir sagen, "irgendwo" einfügen.

Hier ist mein Code:

Memory.h: 
#include <pthread.h> 
class Memory { 
    static pthread_mutex_t mutex_; 
} 

Memory.cpp: 
#include <Memory.h> 
#include <pthread.h> 
Memory::Memory() : 
#ifdef __APPLE__ 
    pthread_mutex_init(&mutex_, NULL); 
#endif 
+0

Hey Kind. Kannst du mir bitte statt eines Downvotings einfach sagen, was ich hinzufügen oder reparieren muss. Ich würde dich runterziehen lassen, wenn du mir den Grund dafür nennen würdest, aber ein solches Loch zu sein wird dir im Leben nicht helfen. –

+0

können Sie mehr Kontext anbieten? Ein minimales vollständiges Programm hilft der Community zu verstehen, was Sie verpasst haben. –

+0

Ok hinzugefügt mehr Kontext. Bitte helfen Sie mir –

Antwort

1

ich Sie da ich davon wollen unter allen Speicher Objekten gemeinsam ein Mutex sein?

Hier gibt es 2 (von vielen) Möglichkeiten, mit subtil verschiedenen Nebenwirkungen:

#include <pthread.h> 
class Memory { 

    // I am assuming that you wanted the mutex to be initialised 
    // at program start? 

    static bool init_mutex(); 

    static pthread_mutex_t mutex_; 
    static bool initialised; 
}; 

bool Memory::initialised = init_mutex(); 

bool Memory::init_mutex() 
{ 
    pthread_mutex_init(&mutex_, 0); 
    return true; 
} 


// or what about upon first use of a Memory? 

class Memory2 
{ 
    struct impl { 
    impl() { 
     pthread_mutex_init(&mutex_, 0); 
    } 

    pthread_mutex_t mutex_; 
    }; 

    static impl& get_impl() 
    { 
    static impl impl_; 
    return impl_; 
    } 

    Memory2() 
    { 
    get_impl(); 
    } 
}; 
+0

Vielen Dank Richard. Ich werde versuchen, diesen Code zu implementieren, und ich werde zurück melden, wenn es funktioniert. Wie auch immer, danke, dass Sie mir eine Antwort geben. –

+0

Ich habe versucht, die erste Lösung, und es gibt mir immer noch den Fehler "Fehler: Mitglied Initialisierer 'init_mutex()' nicht eine nicht statische Daten Mitglied oder Basisklasse", wenn ich die Funktion init_mutex() aus der Memory.cpp aufgerufen. Ich habe die Definition der Funktion und die Variablendeklarationen in der Memory.h, und es gibt mir immer noch diese lästige "nicht-statische" Fehlermeldung. Ich denke, ich werde nur die XCode-Implementierung von Pthreads tbh verwenden. Was die zweite Lösung betrifft, ist das nicht mein Hauptziel und es hat mir noch mehr Fehler bereitet. Trotzdem bin ich dankbar für Ihre aufschlussreiche Antwort. –