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

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

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


First one:

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

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


Second one:

数据争用可能会产生意外结果 . 由于数据争用发生在多个并行线程中,因此它们是多线程能力的问题 .

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


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

回答(1)

3 years ago

数据竞争是关于事件年表的,甚至不是特定于代码中的语句,请考虑以下(单线程)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中代码本身引入竞争条件非常容易 . 因此,线程是一个红色的鲱鱼,它们只是使代码中存在数据竞争的可能性更大,它们的缺失证明什么都没有 .

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

*实际上还有另一种方法,你可以构建程序正确性的正式证明 . 这种方法有点不切实际,至少在计算机科学史上的这个特定时刻 .