如何让 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->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用光盘拷文件损坏,如何让Linux软件RAID1检测光盘损坏?
Linux下Google Test (GTest)测试环境搭建步骤