gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:33:00 25 4
gpt4 key购买 nike

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

#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 次“main”。令我困惑的是,当我在我的旧笔记本电脑上安装的另一个 ubuntu14.04 上做同样的事情时,代码按我的预期执行。这意味着这段代码遇到了数据竞争。

我对vmware了解不多。 vmware 上运行的线程是否被管理并且不会遇到数据竞争?

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

谢谢大家。

数量core可能是主要原因。在将 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;
}

关于c++ - vmware中的线程编程, 'process scheduling'没有发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com