检测C Pthread中的等待线程



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

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

系统:C、Pthread、Linux

附言:如果您需要任何其他详细信息,请在评论中提及。

我可能真的很老套,但我认为只需对代码进行检测并自己测量即可。例如,将以下代码(临时)添加到程序中,并进行搜索和替换,将程序的所有pthread_mutex_lock()调用更改为instrumented_phread_mute x_lock(。

然后运行程序,将stdout重定向到一个文件。之后,您可以查看该文件,查看哪些线程等待了哪些互斥对象很长时间。

(注意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 %pn", (long int) pthread_self(), elapsedTime, mtx);
   }
   return ret;
}

最新更新