我正在开发一个具有大量日志记录的性能关键系统。我计划在一个坚持一个核心的线程中进行我的主要计算,并登录另一个坚持另一个核心的线程。我如何在pthread_setaffinity_np()?
中实现这一点我想我的代码看起来像
void log_something(const string& st) {
pthread_setaffinity_np(pthread_self(),sizeof(cpuset),&cpuset);
//LOG string st;
}
int main() {
while (true) {
// do some computation
log_something(something)
}
}
我的问题是,当我在log_something()中调用pthread_setaffinity_np()时,它是否会在我指定的cpu中进行日志记录,并且在执行日志记录时,返回main()的while循环并继续计算?
或者它会将整个程序切换到该cpu集,并且只会在记录后返回main方法?
谢谢!
[编辑]我以日志记录为例,但我的实际问题比这更复杂。例如,我可能每分钟都要更新一个动态参数,当我更新参数时,我仍然希望在main()方法中继续我的计算基于旧参数(即我无法阻止我的主要参数)参数更新计算)。因此,更新参数的过程可能必须迁移到另一个坚持另一个核心的线程。所以我正在寻找一种分离计算的通用解决方案,而不仅仅是一个高效的记录器。
很抱歉这个混乱。
答案 0 :(得分:1)
当您调用pthread_setaffinity_np
时,它会将该线程设置为永久在指定的cpuset
上执行。它不是某种方法范围。来自documentation,
pthread_setaffinity_np()函数设置线程的CPU关联掩码 线程到cpuset指向的CPU集。如果通话成功,和 该线程当前没有在cpuset中的一个CPU上运行,那么它就是 迁移到其中一个CPU。
听起来你想要分离一个单独的线程来登录你的main函数,然后在main函数和日志记录线程中使用不同的pthread_setaffinity_np
参数调用cpuset
。然后你需要一些方法来从计算线程到日志记录线程进行通信,可能是一个锁和一个队列,也许更复杂一些。这可能是很多工作。
您可能希望查看this SO question,其中讨论了高效的C ++日志库并选择其中一种,因为我怀疑图书馆作者已经完成了艰苦的工作。
答案 1 :(得分:1)
你需要两个独立的线程,每个线程在启动时都会调用pthread_setaffinity_np
。
如果从计算线程调用log_something
,并且要在日志记录线程上完成日志记录,那么它必须将消息放在队列中以供日志记录线程处理,而不是记录本身。日志记录线程将轮询该队列,并记录它在那里找到的任何消息。