首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据竞赛是命令式编程固有的,是并行计算的障碍吗?

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

Stack Overflow用户
提问于 2016-12-08 19:35:02
回答 1查看 63关注 0票数 0

老实说,我学习这个计算领域并不是为了。实际上,我的参考是一些网页和学术文章,然后我是不安全的,但对一些概念的并行计算好奇。

我已经制定了两句话,并想验证它。

第一个:

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

我们可以认为数据竞赛是命令式编程范式的内在特征吗?

第二个:

数据竞赛会产生意想不到的结果。由于数据竞争发生在多个并行线程中,所以它们是多线程能力的问题。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 20:17:36

数据竞赛是关于事件年表的,甚至不特定于代码中的语句,请考虑以下(单线程) JavaScript:

代码语言: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中在代码本身中引入竞争条件也非常容易。因此,线程是一条红鲱鱼,它们只会使代码中存在数据竞争的可能性更大,而它们的缺席证明不了这一点。

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

*实际上还有另一种方法,您可以构造程序正确性的正式证明。这种方法在某种程度上是不切实际的,至少在计算机科学史上的这个特殊时刻是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41047433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档