老实说,我学习这个计算领域并不是为了。实际上,我的参考是一些网页和学术文章,然后我是不安全的,但对一些概念的并行计算好奇。
我已经制定了两句话,并想验证它。
第一个:
命令式语言使用变量来抽象计算机的硬件内存。如果有两个并行线程,并且至少有一个执行写,而没有同步机制,则会发生数据争用。
我们可以认为数据竞赛是命令式编程范式的内在特征吗?
第二个:
数据竞赛会产生意想不到的结果。由于数据竞争发生在多个并行线程中,所以它们是多线程能力的问题。
我们可以认为,数据竞赛不仅是多线程的障碍,也是一般并行计算的障碍。
我的真正目标是编写一些与命令式编程和并行处理相关的文本,以解释函数式编程的好处。欢迎任何更正和进一步的信息。
发布于 2016-12-08 20:17:36
数据竞赛是关于事件年表的,甚至不特定于代码中的语句,请考虑以下(单线程) 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中在代码本身中引入竞争条件也非常容易。因此,线程是一条红鲱鱼,它们只会使代码中存在数据竞争的可能性更大,而它们的缺席证明不了这一点。
解决这个问题的方法只有两种。一种是使用资源锁来尝试确保事件按预期顺序发生。另一项措施是确保不会有任何改变。这就是函数式编程方法:像不可变数据这样的概念,整个程序是一个大的表达式,而不是一系列的步骤等等。
*实际上还有另一种方法,您可以构造程序正确性的正式证明。这种方法在某种程度上是不切实际的,至少在计算机科学史上的这个特殊时刻是如此。
https://stackoverflow.com/questions/41047433
复制相似问题