vmware中的线程编程,'process scheduling'没有发生
Thread programming in vmware, 'process scheduling' didn't happen
我在虚拟机上学习了一些线程编程。未按预期执行的代码如下所示:
#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;
}
相关文章:
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 以某种方式告诉编译器"Do not process line of code"
- 尝试通过Process Pipe发送/接收到python包装器,c ++代码
- Boost::process on Windows - with MinGW?
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- Boost.Process - 从具有休眠循环的进程读取
- AWS Lambda C++ 开发工具包"Process exited before completing request"
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 使用boost.process同时读取和写入孩子的STDIO
- Android 从 Runtime.exec() 或 Java.Process() 执行本机库
- c++ get Process.GetCurrentProcess().SessionId
- BOOST PROCESS RUNTUN()和EXIT_CODE()线程安全
- 传递向量或论点以bubost :: process(boost :: fusion)
- 即使包含 process.h,_beginthreadex 和 _endthreadex 也是未定义的
- 我的程序在尝试将数据集追加到类对象时遇到"Process returned -1073741819 (0xC0000005)"
- 程序在使用异步的 Boost.Process 调用 std::future.get() 后挂起
- 如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
- 由procexp(MS process explorer)创建的VC10调试转储文件-只有堆栈信息,没有变量值
- vmware中的线程编程,'process scheduling'没有发生