Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ 使用简单两阶段锁定的并发程序_C++_Multithreading_Two Phase Commit - Fatal编程技术网

C++ 使用简单两阶段锁定的并发程序

C++ 使用简单两阶段锁定的并发程序,c++,multithreading,two-phase-commit,C++,Multithreading,Two Phase Commit,问题:我想使用所谓的两相锁定概念同时计算一些方程 我的方法是:创建一个数组,该数组将实时更新每个变量的值。我在创建线程、在算法上应用互斥体/信号量以使其并发的方式上有点困难 输入(当然,我将建立一个更大的方程组来测试并发程序的效率) 输入说明: 第1行是未知数的数量。(&0和&1是未知数) 第二行是它们各自的初始值。(&0等于3,&1等于6) 下一行是方程式 输出 &0 = 14 &1 = 11 下面是我实现它们时方程的结构(可以吗?可以改进吗?) struct X{ int

问题:我想使用所谓的两相锁定概念同时计算一些方程

我的方法是:创建一个数组,该数组将实时更新每个变量的值。我在创建线程、在算法上应用互斥体/信号量以使其并发的方式上有点困难

输入(当然,我将建立一个更大的方程组来测试并发程序的效率)

输入说明:

第1行是未知数的数量。(&0和&1是未知数) 第二行是它们各自的初始值。(&0等于3,&1等于6) 下一行是方程式

输出

&0 = 14
&1 = 11
下面是我实现它们时方程的结构(可以吗?可以改进吗?)

struct X{
int id;//计算的变量
int sum;//每个常量的和
std::string eq;//将行作为字符串
无序映射未知数;//存储所有未知数并计数
X(std::string);
void parsing();//解析eq以获取id、总和和未知数
void updateing();//当所有未知项都可用时,更新全局数组上id的值
};
1。在分配之间构建依赖关系图 我认为你的目标是并行计算尽可能多的作业,同时获得相同的结果,就像你一个接一个地顺序计算作业一样。为了确定什么可以并行完成,我建议在赋值表达式之间建立一个依赖关系图

从最后一个赋值开始:任何参与赋值的变量都意味着要计算它,我们需要计算对所涉及变量进行修改的最后一个赋值。以您给出的示例为例:

&0 = 3                // A0 (variable initialization)
&1 = 6                // A1 (variable initialization)
&0 = &0 + 4 + 3       // A2
&1 = &0 - &1 + 2 + 5  // A3
&0 = &1 + 3           // A4
依赖项包括:

A4 <-- A3         (To compute A4, you need to compute A3 before)
A3 <-- A2 and A1  (To compute A3, you need to compute A2 for the value of &0 and A1 for &1)
A2 <-- A0
A1 <-- no dependency
A0 <-- no dependency
当一个线程开始检查它所给出的赋值时,它首先检查它之前是否计算过。如果未计算分配,则必须以使第一个线程执行此检查块访问所有其他线程的方式执行此检查

当第一个线程忙于生成线程以计算依赖项和分配结果时,其他线程在第一次检查时被阻止。当第一个线程最终解锁分配时,所有等待的线程都会看到结果已经计算出来

要开始计算,您应该为您拥有的每个变量生成一个线程,并为它们提供最后一个将变量修改为参数的赋值。在您的示例中,这将是两个线程,从分配A4(最后修改&0)和A3(最后修改&1)开始

一,。在分配之间构建依赖关系图 我认为你的目标是并行计算尽可能多的作业,同时获得相同的结果,就像你一个接一个地顺序计算作业一样。为了确定什么可以并行完成,我建议在赋值表达式之间建立一个依赖关系图

从最后一个赋值开始:任何参与赋值的变量都意味着要计算它,我们需要计算对所涉及变量进行修改的最后一个赋值。以您给出的示例为例:

&0 = 3                // A0 (variable initialization)
&1 = 6                // A1 (variable initialization)
&0 = &0 + 4 + 3       // A2
&1 = &0 - &1 + 2 + 5  // A3
&0 = &1 + 3           // A4
依赖项包括:

A4 <-- A3         (To compute A4, you need to compute A3 before)
A3 <-- A2 and A1  (To compute A3, you need to compute A2 for the value of &0 and A1 for &1)
A2 <-- A0
A1 <-- no dependency
A0 <-- no dependency
当一个线程开始检查它所给出的赋值时,它首先检查它之前是否计算过。如果未计算分配,则必须以使第一个线程执行此检查块访问所有其他线程的方式执行此检查

当第一个线程忙于生成线程以计算依赖项和分配结果时,其他线程在第一次检查时被阻止。当第一个线程最终解锁分配时,所有等待的线程都会看到结果已经计算出来


要开始计算,您应该为您拥有的每个变量生成一个线程,并为它们提供最后一个将变量修改为参数的赋值。在您的示例中,这将是两个线程,从分配A4(最后修改&0)和A3(最后修改&1)开始

尽管听起来有点迂腐,但看起来你并不是在检查方程式,而是在为你的两个变量赋值。另外,输出不应该是
&0=14
&1=11
?如果我错了,请纠正我。@Patrick嗨,Patrick。没错,尽管听起来很迂腐,但看起来你并不是在检查方程式,而是在为你的两个变量赋值。另外,输出不应该是
&0=14
&1=11
?如果我错了,请纠正我。@Patrick嗨,Patrick。正确的,谢谢
computeAssignment(Assignment * as) {
  if (as is not computed) {
    lock Assignment as
    for each dependency of as {
      spawn a thread running computeAssignment(dependency) // Recursion occurs here
    }
    wait for all the threads spawned in the for loop to finish
    compute the result of this assignment
    unlock Assignment as
  }
  return result of as
}