Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++;OpenMP post order遍历错误的打印顺序 在C++中,用OpenMP编写了一个简单的并行后序遍历算法。 #include <string.h> #include <omp.h> #define NUM_THREADS 16 struct node { node* left; node* right; int value; }; void traverseParallelAux(node* cur) { if (cur->left != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->left); if (cur->right != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->right); std::string output = std::to_string(cur->value); output.append(" "); #pragma omp taskwait { #pragma omp critical { std::cout << output; } } } void traverseParallel(node* cur) { #pragma omp parallel num_threads(NUM_THREADS) { #pragma omp single nowait { traverseParallelAux(cur); } } } #包括 #包括 #定义NUM_线程16 结构节点{ 节点*左; 节点*右; int值; }; void transverseParallelaux(节点*cur){ 如果(当前->左!=空) #pragma omp任务第一个专用(cur) 横向平行线(当前->左侧); 如果(当前->右侧!=NULL) #pragma omp任务第一个专用(cur) 横穿平行线(当前->右侧); std::string output=std::to_string(cur->value); 输出。追加(“”); #pragma omp taskwait { #pragma-omp-critical { 标准::cout值=n; cur->left=左; cur->right=右; addLeftRight(左,n-1); addLeftRight(右,n-1); } int main(){ node*n1=(node*)malloc(sizeof(node)); n1->值=4; addLeftRight(n1,3); 横向平行(n1); }_C++_Multithreading_Tree_Openmp_Tree Traversal - Fatal编程技术网 左!=空) #pragma omp任务第一个专用(cur) 横向平行线(当前->左侧); 如果(当前->右侧!=NULL) #pragma omp任务第一个专用(cur) 横穿平行线(当前->右侧); std::string output=std::to_string(cur->value); 输出。追加(“”); #pragma omp taskwait { #pragma-omp-critical { 标准::cout值=n; cur->left=左; cur->right=右; addLeftRight(左,n-1); addLeftRight(右,n-1); } int main(){ node*n1=(node*)malloc(sizeof(node)); n1->值=4; addLeftRight(n1,3); 横向平行(n1); },c++,multithreading,tree,openmp,tree-traversal,C++,Multithreading,Tree,Openmp,Tree Traversal" /> 左!=空) #pragma omp任务第一个专用(cur) 横向平行线(当前->左侧); 如果(当前->右侧!=NULL) #pragma omp任务第一个专用(cur) 横穿平行线(当前->右侧); std::string output=std::to_string(cur->value); 输出。追加(“”); #pragma omp taskwait { #pragma-omp-critical { 标准::cout值=n; cur->left=左; cur->right=右; addLeftRight(左,n-1); addLeftRight(右,n-1); } int main(){ node*n1=(node*)malloc(sizeof(node)); n1->值=4; addLeftRight(n1,3); 横向平行(n1); },c++,multithreading,tree,openmp,tree-traversal,C++,Multithreading,Tree,Openmp,Tree Traversal" />

C++;OpenMP post order遍历错误的打印顺序 在C++中,用OpenMP编写了一个简单的并行后序遍历算法。 #include <string.h> #include <omp.h> #define NUM_THREADS 16 struct node { node* left; node* right; int value; }; void traverseParallelAux(node* cur) { if (cur->left != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->left); if (cur->right != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->right); std::string output = std::to_string(cur->value); output.append(" "); #pragma omp taskwait { #pragma omp critical { std::cout << output; } } } void traverseParallel(node* cur) { #pragma omp parallel num_threads(NUM_THREADS) { #pragma omp single nowait { traverseParallelAux(cur); } } } #包括 #包括 #定义NUM_线程16 结构节点{ 节点*左; 节点*右; int值; }; void transverseParallelaux(节点*cur){ 如果(当前->左!=空) #pragma omp任务第一个专用(cur) 横向平行线(当前->左侧); 如果(当前->右侧!=NULL) #pragma omp任务第一个专用(cur) 横穿平行线(当前->右侧); std::string output=std::to_string(cur->value); 输出。追加(“”); #pragma omp taskwait { #pragma-omp-critical { 标准::cout值=n; cur->left=左; cur->right=右; addLeftRight(左,n-1); addLeftRight(右,n-1); } int main(){ node*n1=(node*)malloc(sizeof(node)); n1->值=4; addLeftRight(n1,3); 横向平行(n1); }

C++;OpenMP post order遍历错误的打印顺序 在C++中,用OpenMP编写了一个简单的并行后序遍历算法。 #include <string.h> #include <omp.h> #define NUM_THREADS 16 struct node { node* left; node* right; int value; }; void traverseParallelAux(node* cur) { if (cur->left != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->left); if (cur->right != NULL) #pragma omp task firstprivate(cur) traverseParallelAux(cur->right); std::string output = std::to_string(cur->value); output.append(" "); #pragma omp taskwait { #pragma omp critical { std::cout << output; } } } void traverseParallel(node* cur) { #pragma omp parallel num_threads(NUM_THREADS) { #pragma omp single nowait { traverseParallelAux(cur); } } } #包括 #包括 #定义NUM_线程16 结构节点{ 节点*左; 节点*右; int值; }; void transverseParallelaux(节点*cur){ 如果(当前->左!=空) #pragma omp任务第一个专用(cur) 横向平行线(当前->左侧); 如果(当前->右侧!=NULL) #pragma omp任务第一个专用(cur) 横穿平行线(当前->右侧); std::string output=std::to_string(cur->value); 输出。追加(“”); #pragma omp taskwait { #pragma-omp-critical { 标准::cout值=n; cur->left=左; cur->right=右; addLeftRight(左,n-1); addLeftRight(右,n-1); } int main(){ node*n1=(node*)malloc(sizeof(node)); n1->值=4; addLeftRight(n1,3); 横向平行(n1); },c++,multithreading,tree,openmp,tree-traversal,C++,Multithreading,Tree,Openmp,Tree Traversal,有没有办法调整输出顺序以便得到正确的结果 正如您在我的代码中所看到的,我已经尝试使用临界区域并在打印字符串之前构建字符串(如其他问题中所建议的),但它没有改变任何内容。或者我写错了什么 非常感谢!您能展示用于创建初始树的代码吗?允许其他用户以简单的方式重现您的问题将提高收到有用答案的机会。请参阅。@NicholasM当然抱歉。更新了问题。我很难理解您为什么希望输出与顺序版本匹配。多线程代码实际上可以一次完成两件事,因此,根据随机调度,某些节点会在其他节点之前完成。如果您强制按特定顺序完成,那么您

有没有办法调整输出顺序以便得到正确的结果

正如您在我的代码中所看到的,我已经尝试使用
临界
区域并在打印字符串之前构建字符串(如其他问题中所建议的),但它没有改变任何内容。或者我写错了什么


非常感谢!

您能展示用于创建初始树的代码吗?允许其他用户以简单的方式重现您的问题将提高收到有用答案的机会。请参阅。@NicholasM当然抱歉。更新了问题。我很难理解您为什么希望输出与顺序版本匹配。多线程代码实际上可以一次完成两件事,因此,根据随机调度,某些节点会在其他节点之前完成。如果您强制按特定顺序完成,那么您的代码基本上是按顺序进行的(由于开销的缘故,代码会更复杂,运行速度也会更慢)。
void addLeftRight(node* cur, int n) {

    if (n <= 0)
        return;

    node* left = (node*)malloc(sizeof(node));
    node* right = (node*)malloc(sizeof(node));

    left->value = n;
    right->value = n;

    cur->left = left;
    cur->right = right;

    addLeftRight(left, n-1);
    addLeftRight(right, n-1);
}

int main() {
    node* n1 = (node*)malloc(sizeof(node));
    n1->value = 4;
    addLeftRight(n1, 3);

    traverseParallel(n1);
}