竞争风险是指两个内存事件(其中至少有一个为写事件)尝试访问同一块内存时,出现不符合基于预期执行顺序的结果。这种风险会导致数据竞争,从而使程序的运行或输出取决于内存事件的实际执行顺序。
竞争检测工具能够识别以下三种典型的竞争风险:
- Write-After-Write(WAW):当两个内存事件尝试向同一块内存写入时,可能存在这种风险,导致内存结果值取决于两个内存事件的实际访问顺序。
- Write-After-Read(WAR):当两个内存事件(一个事件执行读取操作,另一个事件执行写入操作)尝试访问同一块内存时,可能存在这种风险,即写操作事件实际在读操作事件之前执行完毕,并导致读取到的内存值并非预期起始值。
- Read-After-Write(RAW):当两个内存事件(一个事件执行读取操作,另一个事件执行写入操作)尝试访问同一块内存时,可能存在这种风险,即读操作事件实际在写操作事件之前执行完毕,并导致读取到的内存值还未更新。
当竞争检测工具识别出风险,用户就可以修改程序以确保该风险不再存在。在出现“写入后写入”的情况下,可以修改程序,以便同一位置不会发生多次写入。在出现先写后读和先读后写的情况下,可以对读取和写入位置进行确定性地排序。