如何让 Google Test 检测 Linux 上的线程数?

Posted

技术标签:

【中文标题】如何让 Google Test 检测 Linux 上的线程数?【英文标题】:How to make Google Test detect the number of threads on Linux? 【发布时间】:2012-12-27 23:25:59 【问题描述】:

运行使用 Google 测试框架编写的死亡测试时,会为每个测试生成以下警告:

[WARNING] .../gtest-death-test.cc:789:: Death tests use fork(), which is unsafe
particularly in a threaded context. For this test, Google Test couldn't detect
the number of threads.

有没有办法让 Google Test 检测 Linux 上的线程数?

【问题讨论】:

如果这很容易,人们会认为谷歌的聪明人会知道如何做到这一点? ;) @MatsPetersson:嗯,有时候要做的事情太多了。 【参考方案1】:

我查看了源代码,结果发现线程数的检测仅适用于 MacOS X 和 QNX,而不适用于 Linux 或其他平台。所以我通过计算/proc/self/task 中的条目数自己实现了缺失的功能。由于它可能对其他人有用,我将其发布在这里(我也将其发送到Google Test group):

size_t GetThreadCount() 
  size_t thread_count = 0;
  if (DIR *dir = opendir("/proc/self/task")) 
    while (dirent *entry = readdir(dir)) 
      if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
        ++thread_count;
    
    closedir(dir);
  
  return thread_count;

截至 2015 年 8 月 25 日,Google 测试implements GetThreadCount on Linux:

size_t GetThreadCount() 
  const string filename =
      (Message() << "/proc/" << getpid() << "/stat").GetString();
  return ReadProcFileField<int>(filename, 19);

【讨论】:

轻微优化,因为所有条目都是数字,你可以只做if (entry-&gt;d_name[0] != '.') ... 而不是你对strcmp 的两次调用......我相信这真的没关系...... 顺便说一句,我确实喜欢你的解决方案。 @MatsPetersson:谢谢。您对性能的看法是正确的,但它仅适用于无论如何缓慢的死亡测试。 这里是 gtest 问题和补丁的链接(在 Ubuntu 14.04 和 gcc 4.9 上测试):code.google.com/p/googletest/issues/…【参考方案2】:

如果您不太关心测试执行时间,一个方便的替代方法是使用:

::testing::FLAGS_gtest_death_test_style = "threadsafe";

更多详情here.

【讨论】:

我确实关心测试执行时间,但感谢您的回答。不知道这个选项。 也可以作为命令行参数传递:--gtest_death_test_style=threadsafe

以上是关于如何让 Google Test 检测 Linux 上的线程数?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下使用Google Test

linux用光盘拷文件损坏,如何让Linux软件RAID1检测光盘损坏?

Google Test测试框架使用(Linux平台)

Linux下Google Test (GTest)测试环境搭建步骤

IBM Worklight - 如何使用 Google 地图 API

linux中test$count啥意思