C++;向量机中的多线程和进程 P> >通过C++教程书(这是西班牙语,所以我道歉如果我的翻译英语不是那么合适),我遇到了一个特定的代码片段,我不完全理解在背景中发生的不同过程。例如,就多个地址空间而言,我如何确定这些地址空间是否都在单个进程的上下文中(即在每次推送向量的过程中添加多个线程)?如果每个线程都进行了完全相同的计算,我将如何确定它们是否不同于其他线程?) #包括 #包括 #包括 使用名称空间std; int addthreads=0; 空平方数(整数x){ addthreads+=x*x*x; } int main(){ 向量七线程; 对于(int i=1;i
AC++;向量机中的多线程和进程 P> >通过C++教程书(这是西班牙语,所以我道歉如果我的翻译英语不是那么合适),我遇到了一个特定的代码片段,我不完全理解在背景中发生的不同过程。例如,就多个地址空间而言,我如何确定这些地址空间是否都在单个进程的上下文中(即在每次推送向量的过程中添加多个线程)?如果每个线程都进行了完全相同的计算,我将如何确定它们是否不同于其他线程?) #包括 #包括 #包括 使用名称空间std; int addthreads=0; 空平方数(整数x){ addthreads+=x*x*x; } int main(){ 向量七线程; 对于(int i=1;i,c++,multithreading,c++11,pthreads,stdvector,C++,Multithreading,C++11,Pthreads,Stdvector,Athread是进程内的一个“执行线程”,共享相同的地址空间、资源等。根据操作系统、硬件等的不同,它们可能在同一CPU或CPU线程上运行,也可能不在同一CPU或CPU线程上运行 因此,线程编程的一个主要问题是管理对资源的访问。如果两个线程同时访问同一个资源,可能会发生未定义的行为。如果它们都在读,这可能没问题,但如果一个线程在读的同时写,另一个线程在读,则会产生许多结果。最简单的是,两个线程都在运行ng在单独的CPU或内核上,因此读卡器看不到写入器由于缓存所做的更改。另一个原因是读卡器只看到写入
thread
是进程内的一个“执行线程”,共享相同的地址空间、资源等。根据操作系统、硬件等的不同,它们可能在同一CPU或CPU线程上运行,也可能不在同一CPU或CPU线程上运行
因此,线程编程的一个主要问题是管理对资源的访问。如果两个线程同时访问同一个资源,可能会发生未定义的行为。如果它们都在读,这可能没问题,但如果一个线程在读的同时写,另一个线程在读,则会产生许多结果。最简单的是,两个线程都在运行ng在单独的CPU或内核上,因此读卡器看不到写入器由于缓存所做的更改。另一个原因是读卡器只看到写入的一部分(如果是64位值,则可能只看到32位更改)
代码执行读取修改存储操作,因此出现的第一个线程将看到值“0”,计算x*x*x
的结果,将其添加到0
并存储结果
同时,下一个线程出现并执行相同的操作,它在执行计算之前也会看到0
,因此它会将0+x*x*x
写入值,覆盖第一个线程
这些线程可能与您启动它们的顺序不同;线程30可能获得第一个执行周期,而不是线程1
你可能需要考虑<代码> STD::原子或<代码> STD::互斥< <代码> .< /P>我真的不明白你在问什么。这个代码创建线程。(顺便说一句,代码被破坏了。所有这些线程试图同时访问和修改
addthreads
的结果都是未定义的。但是vector
只能由一个线程访问。)这是一个非常糟糕的例子。这是未定义的行为。addthreads
对象不是原子的,有多个线程更新它是未定义的行为。找一本更好的教程。这本是垃圾。@DavidSchwartz如果我的问题看起来有点奇怪,我道歉。基本上,这本书让它看起来好像有多个地址根据您的回答(顺便说一句,谢谢),由于有多个线程被推送到septhread
,所以在不同的位置访问了paces我猜没有使用多个地址空间,线程之间没有差异,对吗?这是正确的。根据定义,线程共享一个公共地址空间。是进程具有单独的、隔离的地址空间。“未定义的行为”意味着您可能会得到预期的答案,或者您可能会得到随机的答案,并且每次执行程序时您可能会得到不同的答案。啊,这是有意义的。谢谢@kfsone,这现在更有意义了。干杯!
#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;
}