Ich möchte einen Thread anhalten, bis ein anderer Thread die Initialisierung beendet hat, ohne pthread_join zu verwenden. Ich habe versucht, einen Join zu verwenden, aber es führt zu einem Deadlock aufgrund eines asynchronen Inter-Thread-Kommunikationssystems, das wir haben. Momentan verwende ich eine (benutzerdefinierte) Sperre, um dies zu erreichen.Warten, bis pthread_create fertig ist, ohne pthread_join zu verwenden
In Gewinde 1:
lock_OfflineWorker.Lock()
if (pthread_create(&tid0, NULL, RunOfflineWorker, NULL) != 0)
{
}
lock_OfflineWorker.TryLock();
lock_OfflineWorker.Unlock();
In Thread 2:
bool OfflineWorker::Initialize()
{
lock_OfflineWorker.Unlock();
}
Aber das ist unelegant und ich bin nicht sicher, ob die Nebenwirkungen (die Möglichkeit für eine andere Sackgasse). Ist das Ok? Wenn nicht, gibt es eine andere Möglichkeit, dies zu erreichen (Schlösser mit oder aus anderen Gründen)
EDIT: Vergessen ist die „RunOfflineWorker“ -Funktion
void* RunOfflineWorker(void* pData)
{
g_OfflineWorker.Initialize();
}
Der OfflineWorker führt die Initialisierung durch und fährt dann mit einer anderen Arbeit fort, habe ich recht? – jpalecek
Ja. Unten in der eigentlichen Funktion gibt es eine Rendite.Es führt einige Herzschlag-Operationen (Bibliotheksfunktionen) aus, führt aber keine schweren Operationen durch. – Gayan
Sie können einen Pthread-Mutex nicht aus einem anderen Thread (portabel) entsperren, zu dem Sie ihn gesperrt haben. Siehe http://opengroup.org/onlinepubs/007908775/xsh/pthread_mutex_lock.html. Verwenden Sie die unten angegebenen Bedingungsvariablen. – Doug