如何使用pthread_setaffinity_np

How to use pthread_setaffinity_np

本文关键字:setaffinity np pthread 何使用      更新时间:2023-10-16

我正在开发一个性能关键型系统,该系统有很多日志记录。我计划在一个线程中做我的主要计算,它坚持一个核心,并记录在另一个线程,坚持另一个核心。如何在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()方法中继续我的计算(即我只是不能停止参数更新的主计算)。因此,更新参数的过程可能必须迁移到粘附到另一个核心的另一个线程。所以我正在寻找一个通用的解决方案分离计算,而不仅仅是一个有效的日志。

很抱歉造成了混乱。

您将需要两个单独的线程,并且每个线程在启动时将调用pthread_setaffinity_np

如果从计算线程调用log_something,并且打算在日志线程上进行日志记录,那么它将不得不将消息放在一个队列中供日志线程处理,而不是自己进行日志记录。日志线程将轮询该队列,并记录它在其中找到的任何消息。

当您调用pthread_setaffinity_np时,它将该线程设置为在指定的cpuset上永远执行。它不是方法作用域的。从文档中,

pthread_setaffinity_np()函数的作用是设置线程的CPU亲和掩码线程指向cpuset所指向的CPU集。如果呼叫成功,则如果线程当前没有在cpuset中的某个cpu上运行,那么它就是已迁移到其中一个cpu

这听起来像你想要在你的主函数中分离一个单独的线程进行日志记录,然后在主函数和日志线程中使用不同的cpuset参数调用pthread_setaffinity_np。然后需要某种方式从计算线程通信到日志线程,可能是锁和队列,也可能是更复杂的东西。那可就麻烦了。

你可能想看看这个SO问题,它讨论了高效的c++日志库,并选择其中一个,因为我怀疑库的作者已经做了艰苦的工作。