2016-07-27 206 views
0

我有一个线程池约100线程。在测试过程中,当我引入一些异常情况时,整个过程变得非常缓慢。一旦我把事情变得正常,这个过程又会变得很快。因此,所有的线程都在运行。检测C中的等待线程Pthread

我想检测哪些线程特别慢。为此,我想编写另一个线程,其职责是监视其他线程,并定期报告哪些线程正在等待资源释放。有没有一种方法(在Pthread中)我可以找到哪些线程正在等待某些资源被释放,即哪些线程被“挂起” - 如果它是一个正确的术语使用?

系统:C,Pthread的,Linux的

PS:请评论提到,如果您需要任何其他细节。

+0

大概不会,但你可能做到这一点你自己 - 在等待之前将一个标志设置为真,并在等待之后将其设置为假? – immibis

+0

当你说“资源”时,你的意思是一个pthread锁/互斥锁或其他东西吗? –

+0

@JeremyFriesner是的,当我说“资源”时,我的意思是一个pthread互斥体。 –

回答

2

我可能真的很老套,但我说只是测试你的代码并自己测量它。例如,将以下代码(临时)添加到程序中,然后执行搜索并替换以将所有程序的pthread_mutex_lock()调用更改为instrumented_pthread_mutex_lock()。

然后用标准输出重定向到一个文件来运行你的程序。之后,您可以查看该文件,并查看哪些线程正在等待很长时间的哪些互斥锁。

(注意printf()的调用将有所改变你的程序的时间,但对于这个目的,我不认为这会多大关系)

#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; 
}