数据竞争是命令式编程固有的并且是并行计算的障碍吗?

Are data races intrinsic to imperative programming and an obstacle for parallel computing?

老实说,我不研究这个计算领域。实际上我的参考资料是一些网络和学术文章然后我不安全但对并行计算的一些概念很好奇。

我已经制定了两个句子并想验证它。


第一个:

命令式语言使用变量来抽象计算机的硬件内存。如果有两个并行线程并且至少有一个执行写入,没有同步机制,则会发生 数据竞争

我们可以认为数据竞争是命令式编程范式所固有的吗?


第二个:

数据竞争会产生意想不到的结果。既然数据竞争是多线程并行的,那就是多线程能力的问题。

我们可以认为数据竞争不仅是多线程的障碍,也是一般并行计算的障碍?


我的真正目标是写一些与命令式编程和并行处理相关的文本来解释函数式编程的好处。欢迎任何更正和进一步的信息。

数据竞争与事件时间顺序有关,甚至不特定于代码中的语句,请考虑以下(单线程)JavaScript:

let fs = require('fs');
let dirContents = fs.readdirSync('./');
let files = dirContents.map(fname => fs.readFileSync(fname, 'utf-8'));

这段代码包含数据竞争,不是因为代码本身做了什么,而是因为在我们(顺序)开始读取第一个文件和我们尝试读取最后一个文件的时间。代码看似很短,但在第 2 行和第 3 行的幕后仍然发生命令式迭代。

和JavaScript尽管是单线程的,但充满并发性,上面的fs函数名称中有'Sync'的原因是因为默认版本是异步的,而且令人惊讶的是JavaScript 中的代码本身很容易引入竞争条件。所以线程是一条红鲱鱼,它们只是使代码中存在数据竞争的可能性更大,它们的存在证明不了什么。

只有两种*方法可以解决此问题。一种是使用资源锁来尝试确保事件按预期顺序发生。另一个是确保原地没有任何变化。这就是函数式编程方法:不可变数据等概念,整个程序是一个大表达式而不是一系列步骤等。

*其实还有一个办法,可以构造程序正确性的形式化证明。这种方法有些不切实际,至少在计算机科学史上的这个特殊时刻是这样。