对多线程输出进行排序

时间:2018-02-22 05:58:59

标签: multithreading parallel-processing

假设我有一个程序需要一系列整数并输出它们的方块。在伪代码中,这可能看起来像:

For (i = 1; i = 10; i++){
  print "i squared is" >> i^2 >> endl;
  }

如果我按顺序运行,我会期望“我平方为1”,“我平方为4”,依此类推。但是,如果我并行运行它,每个线程将采用i的单个值并将其平方。不能保证i = 1的线程会先完成,所以我可能会输出:“我的平方是9”,“我的平方是81”,“我的平方是49”等伪随机顺序。

显然,并行输出更难以解释。我可以更改代码,使其打印i和i ^ 2,但即便如此,它仍然难以解释。有没有办法让输出按升序仍然并行进行平方?这个问题看起来很通用,肯定某个人肯定已经回答过了,但我的谷歌搜索只能找到并行排序算法的结果。

1 个答案:

答案 0 :(得分:0)

(回答我自己的问题,因为高绩效标记所有,但在评论中写了答案 - 所有信用给他)

有没有办法让输出按升序排列并且仍然可以并行进行平方?

是。定义一个长度为10的数组,并让每个线程将其值输出到数组中的相应元素。这并不总是很容易做到(你可能需要调整循环,以便它可以为的每个值独立运行),但是OP中的示例没有这个问题。在伪代码中:

db.collection.aggregate([
    { ... }, // <-- previous pipeline
    {
        "$project": {
            "specList": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$specificationList.values",
                        "as": "el",
                        "in": {
                            "k": "$$el.key",
                            "v": { "$arrayElemAt": ["$$el.value", 0] }
                        }
                    }
                }
            }
        }
    }
])