【发布时间】:2019-03-18 17:19:27
【问题描述】:
所以我有一些带有双重检查锁定解决方案的代码,用于在多线程(使用 openmp)应用程序中读取数据文件,看起来像:
logical, dimension(10,10) :: is_data_loaded
is_data_loaded=.false.
! Other code
subroutine load(i,j)
integer,intent(in) :: i,j ! Indexes into array is_data_loaded
if(is_data_loaded(i,j)) return
!$OMP CRITICAL(load data)
if(.not.is_data_loaded(i,j)) then
call load_single_file(i,j)
is_data_loaded(i,j) = .true.
endif
!$OMP END CRITICAL(load_data)
end subroutine
我担心如果两个线程同时到达关键区域(具有相同的 i,j 索引),第二个线程会被第一个进入该区域的线程阻塞,但是一旦第一个线程完成,第二个线程可能在看到更新的 is_data_loaded 标志之前开始执行关键块,因此我们遇到了两个线程更新相同数据的问题。
首先,这是 opemp 关键块的问题吗?我不确定语义以及标准是否说“在下一个线程在关键块中运行之前,线程之间的所有内容都必须保持一致”之类的内容。如果这是一个问题,仅仅将读/写内容包装到一个 omp atomic 语句中就足够了吗?
【问题讨论】:
-
谢谢,现在很好,但我不会在一个线程完成和下一个开始之间仍然存在潜在的竞争条件(第二个可能没有同步 is_data_loaded 中的更改)?
-
好吧,你没有告诉我们应该有什么样的竞争条件。即使没有任何
critical,您的代码中也不存在竞争条件,前提是您始终为不同的索引调用load。你真的应该准备一个minimal reproducible example 并展示你想要避免的竞争条件。代码应包括对load()的调用以及load_single_file内部发生的情况。
标签: multithreading fortran openmp