- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在浏览一本 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::atomic
或 std::mutex
。
关于 vector 中的 C++ 多线程和进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553001/
我是一名优秀的程序员,十分优秀!