Intel® Cilk™ Plus 程序中的确定性竞争和数据竞争

在Intel® CilkTM Plus程序中,当多个并行strand访问同一内存且至少其中之一执行写操作时,就会产生确定性竞争。此时程序的运行结果将依赖于哪一个strand“赢得竞争”而先访问内存。 当程序多遍执行时,其输出的结果可能会随机地发生变化,虽然在某些情况下这些不同的结果都是正确的。

数据竞争是确定性竞争的一个特例,是当多个不拥有公共锁的并行strand访问同一内存且至少其中之一执行写操作时产生的竞争。程序的运行结果仍然将依赖于哪一个strand“赢得竞争”而先访问内存。

如果这些并行访问都通过加锁进行了保护,那么根据我们的定义,这时就不会产生数据竞争。但是,使用了锁的程序仍可能无法在多次运行时给出确定的结果。这是因为简单的加锁可以通过防止数据结构在被更新的过程中出现可见的中间状态来保证其一致性,但却无法保证多个strand在每次运行时都按照确定的顺序访问共享数据,因此最后得到的结果仍是不确定的。

所以在Intel® CilkTM Plus程序中,当两个并行strand访问同一内存且至少其中之一执行写操作时就一定会产生确定性竞争,但并不一定会产生数据竞争,因为这些操作有可能通过锁进行了保护。

有关编译器优化的更完整信息,请参阅优化通知