Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;向量机中的多线程和进程 P> >通过C++教程书(这是西班牙语,所以我道歉如果我的翻译英语不是那么合适),我遇到了一个特定的代码片段,我不完全理解在背景中发生的不同过程。例如,就多个地址空间而言,我如何确定这些地址空间是否都在单个进程的上下文中(即在每次推送向量的过程中添加多个线程)?如果每个线程都进行了完全相同的计算,我将如何确定它们是否不同于其他线程?) #包括 #包括 #包括 使用名称空间std; int addthreads=0; 空平方数(整数x){ addthreads+=x*x*x; } int main(){ 向量七线程; 对于(int i=1;i_C++_Multithreading_C++11_Pthreads_Stdvector - Fatal编程技术网

C++;向量机中的多线程和进程 P> >通过C++教程书(这是西班牙语,所以我道歉如果我的翻译英语不是那么合适),我遇到了一个特定的代码片段,我不完全理解在背景中发生的不同过程。例如,就多个地址空间而言,我如何确定这些地址空间是否都在单个进程的上下文中(即在每次推送向量的过程中添加多个线程)?如果每个线程都进行了完全相同的计算,我将如何确定它们是否不同于其他线程?) #包括 #包括 #包括 使用名称空间std; int addthreads=0; 空平方数(整数x){ addthreads+=x*x*x; } int main(){ 向量七线程; 对于(int i=1;i

C++;向量机中的多线程和进程 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或内核上,因此读卡器看不到写入器由于缓存所做的更改。另一个原因是读卡器只看到写入

A
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;

}