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

标签 c++ multithreading c++11 pthreads stdvector

在浏览一本 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/

相关文章:

c++ - "not in this scope"cpp函数调用错误

java - 异步方法抛出异常是否合理?

java - 同时从列表中删除对象

Java - if 语句是线程安全的吗?

c++ - l-value ref限定成员函数和非限定成员函数之间的区别?

c++ - 无法在 VS 2010 中使用括号初始化 POD 类型?

c++ - 在 C++ 中管理成员函数执行

c++ - 使目标需要 32 位和 64 位构建的 dll

haskell - C++11 相当于 Haskell 的 "inits"

c++ - 位域的完美转发解决方法