如何使用pthread_setaffinity_np

时间:2011-11-16 14:55:10

标签: c++ c pthreads parallel-processing

我正在开发一个具有大量日志记录的性能关键系统。我计划在一个坚持一个核心的线程中进行我的主要计算,并登录另一个坚持另一个核心的线程。我如何在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()方法中继续我的计算基于旧参数(即我无法阻止我的主要参数)参数更新计算)。因此,更新参数的过程可能必须迁移到另一个坚持另一个核心的线程。所以我正在寻找一种分离计算的通用解决方案,而不仅仅是一个高效的记录器。

很抱歉这个混乱。

2 个答案:

答案 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,并且要在日志记录线程上完成日志记录,那么它必须将消息放在队列中以供日志记录线程处理,而不是记录本身。日志记录线程将轮询该队列,并记录它在那里找到的任何消息。