【问题标题】:Detect waiting threads in C Pthread检测 C Pthread 中的等待线程
【发布时间】:2016-07-27 20:19:42
【问题描述】:

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

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

系统:C、Pthread、Linux

PS:如果您需要任何其他详细信息,请在 cmets 中提及。

【问题讨论】:

  • 可能不会,但您可以自己做 - 在等待之前将标志设置为 true,在等待后将其设置为 false?
  • 当您说“资源”时,您是指 pthread 锁/互斥锁还是其他?
  • @JeremyFriesner 是的,当我说“资源”时,我指的是 pthread 互斥体。

标签: c multithreading pthreads freeze


【解决方案1】:

我可能真的很老套,但我说只是检测您的代码并自己测量它。例如,将类似以下代码(临时)添加到您的程序中,并执行搜索和替换以将您程序的所有 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 2010-10-29
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多