Frage

Was ist eine gute Möglichkeit, einen Singleton zu implementieren, der nur auf den Thread beschränkt ist, der seine Instanz sucht?Gibt es eine Thread-ID oder etwas, mit dem ich das tun kann?Ich verwende die Carbon-Threading-API, muss diese aber später auch unter Windows und reinem POSIX implementieren, daher ist jede Technik willkommen.

War es hilfreich?

Lösung

In der Vergangenheit habe ich einen hashmap oder Index zu speichern, Datenstrukturen genutzt, die innerhalb eines einzigen globalen Thread-sichere Datenstruktur pro Thread sind. Zum Beispiel, wenn man die ID für jeden Thread als Inkrementieren ganzen Zahl bereitstellen, können Sie die Datenstruktur in einer im Voraus zugewiesenen Anordnung an dem Index des Gewindes es speichern. Wenn Sie Thread-IDs nutzen, die vom Betriebssystem zur Verfügung gestellt werden, oder müssen flexibler sein, dann wird ein Thread-sicher HashMap oder HashTable kommt in ganz praktisch.

Jacob

Andere Tipps

Wie wäre es etwas ähnliches wie Thread in Java? Posix / Kohlenstoff sollte etwas haben Thread nicht wahr?

Ich möchte den Singleton-Zeiger in die lokale Thread-Speichermethode des Systems einfügen.Sie haben mehrere genannt, und ich kenne nicht die richtigen Beschwörungsformeln dafür, aber die meisten Threading-Systeme verfügen über eine Art lokales Thread-Speicherkonzept.

Wenn dies bei Ihrem Threading-System nicht der Fall ist UND Ihr Threading-System über eine eindeutige Thread-ID verfügt, ist eine Hash-Tabelle (durch Thread-ID verschlüsselt) wahrscheinlich die beste Wahl.

Wir verwenden eine Klasse, die eine Karte von Thread-ID-Daten gespeichert werden, um unsere lokalen Threadspeicher zu implementieren. Dies scheint sehr gut zu funktionieren, dann kann eine Instanz dieser Klasse überall Sie lokale Speicher fädeln platziert werden müssen. Normalerweise Clients eine Instanz als statischer privater Bereich.

Hier ist eine grobe Skizze des Codes

template <class T>
struct ThreadLocal {
    T & value()
    {
        LockGuard<CriticalSection> lock(m_cs);

        std::map<int, T>::iterator itr = m_threadMap.find(Thread::getThreadID());

        if(itr != m_threadMap.end())
                return itr->second;

        return m_threadMap.insert(
                std::map<int, T>::value_type(BWThread::getThreadID(), T()))
                        .first->second;
    }

    CriticalSection             m_cs;
    std::map<int, T>    m_threadMap;
};

Dies wird dann verwendet als

class A {
    // ...

    void doStuff();
private:
   static ThreadLocal<Foo> threadLocalFoo;
};

ThreadLocal<Foo> A::threadLocalFoo;

void A::doStuff() {
    // ...
    threadLocalFoo.value().bar();
    // ...
}

Das ist einfach und funktioniert auf jeder Plattform, wo Sie die Thread-ID bekommen. Hinweis der kritische Abschnitt wird nur verwendet, um den Verweis auf das Rück / erstellen, sobald Sie die Referenz alle Anrufe außerhalb des kritischen Abschnitts haben.

Ich bin mir nicht sicher, ob dies Ihre Frage zu beantworten, aber in meinem Design Muster-Klasse, ich habe so etwas wie dies gelernt:

- (id) getInstance{
     @synchronized(self){
          if (mySingletonInstance == nil){
               @synchronized(self){
                   mySingletonInstance = [[mySingleton alloc] init];
               }
          }
     }
     return mySingletonInstance;
}

Obwohl der Code in Objective-C ist, sollte die Idee in einer anderen Sprache etwa gleich sein, IMHO.

Wenn Sie mit pthreads zufrieden sind, sollten Sie auf

suchen

Dies sollte OSX decken und Linux (ich habe Kohlenstoff nicht verwendet, aber ich glaube, dass es wirklich OS Threads verwendet, und deshalb spielt schön mit pthreads).

Fenster haben die gleiche Grundidee mit unterschiedlichen Namen und eine etwas andere Schnittstelle:

http://msdn.microsoft.com/en-us/library /ms686991.aspx

Damit können Sie den „Singleton“ (*) für einen Faden aus diesem Thread nur zugreifen, aber es klingt wie das ist, was Sie wollen. Wenn Sie einen beliebigen Thread des Objekts von einem anderen Thread können zugreifen wollen, dann müssen Sie eine Struktur auf einem pthread_t verkeilt, und mit ziemlicher Sicherheit eine gewisse Synchronisation. Sie erhalten pthread_t Werte (das heißt, Thread-IDs) von pthread_self oder pthread_create.

(*) Wenn Sie eine pro Thread haben, ist es technisch nicht ein Singleton ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top