2016-07-27 32 views
0

Ich habe einen Thread-Pool mit etwa 100 Threads. Während des Testens, wenn ich einige anomale Bedingungen einführe, wird der Gesamtprozess sehr langsam. Sobald ich die Dinge normal mache, wird der Prozess wieder schnell. Daher werden alle Threads ausgeführt.Detect wartende Threads in C Pthread

Ich möchte erkennen, welche Threads besonders langsam werden. Dazu möchte ich einen anderen Thread schreiben, dessen Aufgabe es sein wird, andere Threads im Auge zu behalten und periodisch zu berichten, welcher von ihnen auf die Freigabe einer Ressource wartet. Gibt es einen Weg (in Pthread) kann ich finden, welche Threads darauf warten, dass einige Ressourcen freigegeben werden, d. H. Welche Threads "hängen" - wenn es ein richtiger Begriff ist?

System: C, Pthread, Linux

PS: erwähnen Sie bitte in den Kommentaren, wenn Sie weitere Details benötigen.

+0

Wahrscheinlich nicht, aber man könnte es vielleicht tun Sie selbst - Setzen Sie ein Flag auf "True", bevor Sie warten, und setzen Sie es nach dem Warten auf "False". – immibis

+0

Wenn Sie "Ressource" sagen, meinen Sie eine Pthread-Sperre/Mutex oder etwas anderes? –

+0

@JeremyFriesner Ja, wenn ich "Ressource" sage, meine ich einen Pthread Mutex. –

Antwort

2

Ich bin wahrscheinlich sehr altmodisch, aber ich sage nur instrumentieren Sie Ihren Code und messen Sie es selbst. Fügen Sie Ihrem Programm z. B. etwas (wie dem folgenden Code) hinzu, und führen Sie ein Suchen und Ersetzen durch, um alle pthread_mutex_lock() - Aufrufe Ihres Programms zu instrumentierte_pthread_mutex_lock() zu ändern.

Dann führen Sie Ihr Programm mit stdout in eine Datei umgeleitet. Danach können Sie in die Datei schauen und sehen, welche Threads lange auf welche Mutexe gewartet haben.

(Beachten Sie, dass die printf() ruft das Timing des Programms etwas ändern, aber für diesen Zweck Ich glaube nicht, dass viel Materie wird)

#include <stdio.h> 
#include <unistd.h> 
#include <sys/times.h> 

static unsigned long long GetCurrentClockTimeMicroseconds() 
{ 
    static clock_t _ticksPerSecond = 0; 
    if (_ticksPerSecond <= 0) _ticksPerSecond = sysconf(_SC_CLK_TCK); 

    struct tms junk; clock_t newTicks = (clock_t) times(&junk); 
    return ((((unsigned long long)newTicks)*(1000000))/_ticksPerSecond); 
} 

int instrumented_pthread_mutex_lock(pthread_mutex_t * mtx) 
{ 
    unsigned long long beforeTime = GetCurrentClockTimeMicroseconds(); 
    int ret = pthread_mutex_lock(mtx); 
    unsigned long long afterTime = GetCurrentClockTimeMicroseconds(); 

    unsigned long long elapsedTime = (afterTime-beforeTime); 
    if (elapsedTime > 1000) // or whatever threshold you like; I'm using 1 millisecond here 
    { 
     printf("Thread %li took %llu microseconds to acquire mutex %p\n", (long int) pthread_self(), elapsedTime, mtx); 
    } 
    return ret; 
}