c ++ - 如何知道线程上下文切换何时发生?

时间:2016-09-10 23:54:03

标签: c++ multithreading

就像标题一样,我们怎么知道在c ++中使用std :: threads时上下文切换是什么时候发生的

例如

void a()
{
   //some code
}                                    
void b(); 
{
   //some code 
}                                    

int main ()
{
  thread th1 (a);       
  thread th2 (b); 

  th1.join();                                        
  th2.join();                                       

  return 0;
} 

有没有办法知道O.S何时进行线程切换,我们实际上可以在相应的函数处理时描绘打印a或b。

注意:我已经使用互斥锁和控制变量放置一个简单的cout<<&##; a正在处理"在他们身上并不一定描绘真正的上下文切换。

3 个答案:

答案 0 :(得分:1)

  

我们实际上可以描绘,就像在处理相应的功能时打印a或b一样。

如果这仅用于演示/教学目的

让我用这个比喻:你有一个黑盒控制器(OS),它将电流推过两个二极管(线程)。由于您对控制器没有任何命令,因此查看当前流动路径的唯一方法是用LED替换二极管 - 在电流流过它们的所有时刻,它们都会发光。 (注意:由于LED可能与它所取代的二极管不相同,你不会想要销售可能炸掉魔法烟雾的产品 - 也就是说“不要在实验室内的诊断案例之外使用这种技术” “)

a()b()函数而言,这可以转化为使它们在执行每条指令时“发光”(或者只是为了达到演示目的而完成这些指令)。

因此,编写一个包装这些指令的宏,除了执行指令外,它们还有一个副作用,可用于检测哪些线程正在运行。 提醒您:它们可以在两个不同的CPU内核上同时运行。

该技术通常被称为“仪器”,并通过例如性能评估工具使用(适用于其特定情况)。

答案 1 :(得分:1)

可能没有 上下文切换知道。

在具有两个(或更多)内核的计算机上,两个线程可能同时运行,在完成之前根本不会发生上下文切换。

请注意,大多数当前计算机至少有两个核心,而具有4到8个核心的计算机已经非常普遍。假设像这样的代码将导致任何上下文切换基本上是过时的。从理论上讲,它已经过时了很长时间(即已经已经成为并行机器几十年了。)

现在它实际上已经完全过时了 - 即使你通过他人放弃或捐赠的垃圾来获取你的新电脑,他们的旧垃圾至少有两个核心,四个机会仍然相当不错根本不可能。

答案 2 :(得分:0)

你无法知道,也没有理由知道。

内核/硬件线程和上下文管理背后的驱动原则之一是专门使整个过程对您不可见。如果两个线程在不同的核心上运行,那么两个线程(系统上的其他线程)之间甚至可能没有任何上下文切换。

如果您认为自己需要这样做,可能需要坐下来重新考虑您的设计,并熟悉通常可供您使用的各种同步结构。