gpt4 book ai didi

vector 中的 C++ 多线程和进程

转载 作者:行者123 更新时间:2023-11-30 03:38:29 27 4
gpt4 key购买 nike

在浏览一本 C++ 教程书时(它是西类牙语的,所以如果我的英语翻译不尽如人意,我深表歉意)我遇到了一个特定的代码片段,我在不同的方面并不完全理解在后台发生的进程。例如,就多个地址空间而言,我如何确定它们是否都在单个进程的上下文中(因为在每次推送到 vector 时都会添加多个线程)?如果每个线程进行完全相同的计算,我将如何确定它们是否不同?)

#include <iostream>
#include <vector>
#include <thread>

using namespace std;

int addthreads = 0;

void squarenum(int x) {

addthreads += x * x * x;

}

int main() {

vector<thread> septhread;

for (int i = 1; i <= 9; i++){

septhread.push_back(thread(&squarenum, i));

}

for (auto& th : septhread){

th.join();

}

cout << "Your answer = " << addthreads << endl;

system("pause");

return 0;

}

每个答案都默认为 2025 年,我明白这一点。我的基本问题是理解我问题的第一部分。

顺便说一句,需要编译器(如果你在 Linux 上):

g++ -std=gnu++ -pthread threadExample.cpp -o threadExample

最佳答案

thread 是进程中的“执行线程”,共享相同的地址空间、资源等。根据操作系统、硬件等,它们可能运行也可能不运行相同的 CPU 或 CPU 线程。

因此,线程编程的一个主要问题是管理对资源的访问。如果两个线程同时访问同一个资源,就会发生未定义行为。如果他们都在阅读,那可能还好,但如果一个人同时在写作,另一个人在阅读,就会产生许多结果。最简单的是两个线程都在不同的 CPU 或内核上运行,因此读取器看不到写入器由于缓存而做出的更改。另一个是读取器只能看到写入的一部分(如果它是 64 位值,他们可能只会看到 32 位更改)。

您的代码执行读取-修改-存储操作,因此第一个出现的线程看到值“0”,计算 x*x*x 的结果,将其添加到 0 并存储结果。

与此同时,下一个线程出现并做同样的事情,它在执行计算之前也看到了 0,因此它将 0 + x*x*x 写入值,覆盖第一个线程。

这些线程可能按照您启动它们的顺序;线程 #30 有可能获得第一个执行周期而不是线程 #1。

您可能需要考虑查看 std::atomicstd::mutex

关于 vector 中的 C++ 多线程和进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553001/

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