向量中的 C++ 多线程和进程

C++ multiple threads and processes in vector

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

#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是进程中的一个"thread of execution",共享相同的地址space、资源等。根据操作系统、硬件等,它们可能也可能会不在同一个 CPU 或 CPU 线程上 运行。

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

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

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

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

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