vmware中的线程编程,'process scheduling'没有发生

Thread programming in vmware, 'process scheduling' didn't happen

本文关键字:scheduling process 编程 vmware 线程      更新时间:2023-10-16

我在虚拟机上学习了一些线程编程。未按预期执行的代码如下所示:

#include <iostream>
#include <thread>
using namespace std;
void function01() {                                                                                                                   
      for (int i=0; i<100; i++) {                                                                                                   
               std::cout << "from t1:" << i << std::endl;                                                                            
      }                                                                                                                             
}   
int main() {
 // data race and mutex                                                                                                                                             
       std::thread t1( function01 );                                                                                                 
       for (int i=0; i<100; i++) {                                                                                                   
              std::cout << "from main:" << i << std::endl;                                                                          
       }                                                                                                                             
       t1.join();   
       return 0;
}

这些代码应该在标准输出上进行数据竞赛。但是当我编译它时

:!g++ -std=c++11 -pthread ./foo.cpp

并运行,每次我得到的结果是 100 次"t1"紧随 100 次"主要"。让我感到困惑的是,当我在安装在旧笔记本电脑上的另一个 ubuntu14.04 上做同样的事情时,代码按我的预期执行。这意味着这段代码遇到了数据竞争。

我对 vmware 了解不多。在 vmware 上运行的线程是否受到管理,不会遇到数据争用?

-------------第二次编辑-----------------------

谢谢大家。

核心的数量可能是主要原因。在将 vm 核心数量设置为多个后,我得到了预期的结果。

您的新机器可能比旧机器快得多。因此,它能够在main进入自己的循环之前完成function01的执行。

或者它只有一个 CPU,因此一次只能执行一个例程。而且由于您的循环需要非常少量的计算,因此CPU可以在操作系统提供给它的一段时间内完成。

确保为 VM 分配了多个 CPU。并尝试使循环中的每一步都"更重"。

double accumulator = 0;
for (int i=0; i<100; i++) {
    for (int j=1; j<1000*1000; j++)
        accumulator += std::rand();
    std::cout << "from t1:" << i << std::endl;
}

我认为问题出在时间片上。您可以通过在代码中引入一些延迟来自己验证它。例如:

#include <iostream>
#include <chrono>
#include <thread>
void function01() {
    for (int i=0; i<100; i++) {            
       std::cout << "from t1:" << i << std::endl;
       std::this_thread::sleep_for(std::chrono::duration<double, std::milli>{10});
    }
}   
int main() {
   // data race and mutex
   std::thread t1( function01 );
   for (int i=0; i<100; i++) {
       std::cout << "from main:" << i << std::endl;
       std::this_thread::sleep_for(std::chrono::duration<double, std::milli>{10});
   }
   t1.join();   
   return 0;
}