向量中的 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::atomic
或 std::mutex
。
在浏览一本 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::atomic
或 std::mutex
。