gpt4 book ai didi

c++ - 为工作线程任务实现分析器

转载 作者:行者123 更新时间:2023-11-27 23:38:25 25 4
gpt4 key购买 nike

我有许多工作线程处理名为 class Task 的任务。我在 x86_64 Windows/Mac/Linux 上使用 C++。在处理每个任务时,我可以更新全局 Task* activeTasks[] 数组,以便应用程序知道每个工作人员何时处理哪个任务。

activeTasks[threadId] = &task;
task.work();
activeTasks[threadId] = NULL;

我想编写一个简单的应用程序内分析器,以便用户可以看到每个任务花费了多少微秒。

另一个复杂的问题是任务可能会在它们的work() 函数中调用sleep()。探查器应该只在线程处于事件状态时对任务进行采样,而不是休眠或被调度程序挂起。

如何实现这样的分析器?这似乎正是像 perf 这样的分析器的工作方式,除了它们检查当前调用堆栈而不是 activeTasks 数组。

尝试

一个天真的想法是启动一个单独的探查器线程,每隔几微秒定期检查 activeTasks[threadId],如果工作线程处于运行状态,则为每个任务递增一个计数器。这可以在 Windows 上使用 thread.ExecutionState == 3 进行检查,也可以使用 pthreads 进行检查。但问题在于,在单核机器上,运行分析器线程和任何工作线程永远不会同时运行,因此分析器总是会将工作线程视为“已暂停”。

另一个想法是触发某种中断,但我不知道这是怎么做到的。

最佳答案

听起来您想测量线程 CPU 时间。

在 Win32(使用 GetThreadTimes )和 pthreads(使用 pthread_getcpuclockid )中有一些方法可以做到这一点。

long startTime = getThreadCPUTime();
task.work();
long endTime = getThreadCPUTime();
// lock mutex
taskTimes[taskType] += endTime - startTime;
// unlock mutex

关于c++ - 为工作线程任务实现分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com