我有一个函数foo,该函数将指向内存的指针作为参数,并写入和读取该内存:
foo
cdef void foo (double *data): data[some_index_int] = some_value_double do_something_dependent_on (data)
我分配data喜欢这样:
data
cdef int N = some_int cdef double *data = <double*> malloc (N * sizeof (double)) cdef int i for i in cython.parallel.prange (N, nogil=True): foo (data) readout (data)
我的问题现在是:不同的线程如何处理呢?我的猜测是,指向的内存data将由所有线程共享,并在函数内部“同时”读取或写入foo。然后,由于不能依赖先前设置的datavalue(在内foo),这会弄乱所有结果?我的猜测是正确的还是在cython编译器中实现了一些魔术安全带?
提前非常感谢您。
我假设没有data线程的读或写同步锁将读/写到内存位置并覆盖彼此的更改。没有某种同步,您将不会获得一致的结果。
尽管文档(http://docs.cython.org/src/userguide/parallelism.html)似乎建议OpenMP( 默认后端 )自动创建线程本地。