gpt4 book ai didi

multithreading - 读/写模块数组的不同元素是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-03 12:54:31 30 4
gpt4 key购买 nike

只要程序不允许同时写入存储在模块中的共享数据结构的相同元素,它是线程安全的吗?我知道这是一个菜鸟问题,但在任何地方都找不到明确解决的问题。情况如下:

在程序开始时,数据被初始化并存储在模块级可分配数组(FIELDVARS)中,然后任何子程序都可以访问该数组,其中模块被 USE 引用。陈述。

现在假设程序进入多线程和/或多核计算阶段,FIELDVARS在重复多次同时调用子程序(COMPUTE)期间访问“读/写”操作。

计算阶段完成后,程序返回单线程阶段,FIELDVARS必须在后续子例程中使用 (POST)。但是,FIELDVARS无法添加到 COMPUTE 的输入参数中或 POST因为这些是从闭源主程序调用的。因此,模块级数组用于在子程序之间传递 addt'l 数据。

假设 FIELDVARSCOMPUTE已设计为每次调用 COMPUTE将始终允许访问 FIELDVARS 的一组唯一元素,保证与任何其他调用不同,因此永远不会发生对相同元素的同时“写入”操作。例如:

[ 1, 2, 3, 4, 5,  6, 7, 8, 9, 10, ... ]  <-- FIELDVARS
^---call 1---^ ^---call 2---^ ... <-- Each call to COMPUTE is guaranteed to access a specific set of elements of FIELDVARS.

问题:这种情况是否被认为是“线程安全的”、“条件安全的”或“非线程安全的”?如果不安全,具体的危险是什么?您建议如何处理?

其他相关细节:
  • 主程序控制线程。
  • 主程序源代码不可用,无法更改。
  • 主程序控制如何/何时COMPUTE , POST , 和其他子程序被调用,以及可以传入哪些args。这就是为什么模块级数组用于在不同子程序之间传递数据而不是作为arg。


  • ! DEMO MODULE W/ ALLOCATABLE INTEGER ARRAY
    module DATA_MODULE
    integer, dimension(:), allocatable :: FIELDVARS !<-- allocated/populated elsewhere, prior to calling COMPUTE
    end module DATA_MODULE


    ! DEMO COMPUTE SUBROUTINE (THREADED PHASE W/ MULTIPLE SIMULTANEOUS CALLS)
    subroutine COMPUTE(x, y, x_idx, y_idx, flag)
    use DATA_MODULE
    logical :: flag
    integer :: x,y,x_idx,y_idx !<-- different for every call to COMPUTE
    if (flag == .false.) then !<-- read data only
    ...
    x = FIELDVARS(x_idx)
    y = FIELDVARS(y_idx)
    ...
    else if (flag == .true.) then !<-- write data
    ...
    FIELDVARS(x_idx) = 0
    FIELDVARS(y_idx) = 0
    ...
    endif
    end subroutine COMPUTE

    最佳答案

    这很好,许多程序都依赖于这个事实。在 OpenMP 中,您经常循环遍历数组,并且不同的线程可以轻松地处理内存中彼此靠近的元素,尤其是在分配给每个线程的 block 的边界上。

    在现代 CPU 中,这不是问题。另见 https://en.wikipedia.org/wiki/Cache_coherence

    真正的问题是False sharing .使用属于同一 chache 行的内存元素的两个或多个线程将竞争共享资源,并且可能非常慢。

    关于multithreading - 读/写模块数组的不同元素是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44789607/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com