Я внес несколько изменений в исходный вопрос.Оказывается, что часть malloc на самом деле, вероятно, является проблемой, как предлагается в комментариях.
Я хочу запустить функцию в цикле prange Cython, как показано в коде ниже.Этот код выдает ошибку « double free или коррупция (fasttop) ».
Когда я запускаю код с флагом prange «num_threads = 1», все в порядке.Я понимаю, что мой код не является потокобезопасным, вероятно, но я не понимаю, почему.
import numpy as np
cimport numpy as np
cimport cython
from cython.parallel import prange
from libc.stdlib cimport malloc, free
cdef int my_func(int[:] arr_cy, int c) nogil except -1:
cdef int i
cdef int *arr_to_process = <int *>malloc(c * sizeof(int))
if not arr_to_process:
with gil:
raise MemoryError()
try:
for i in range(c):
arr_to_process[i] = 1
finally:
free(arr_to_process)
return 0
def going(a):
cdef int c
for c in prange(100000, nogil=True, num_threads=2):
my_func(a, c)
def get_going(iterations):
arr = np.arange(1000000, dtype=np.intc)
cdef int [:] arr_v = arr
for a in range(iterations):
print('iter %i' %a)
going(arr_v)
, если я запускаю get_going(iterations)
с достаточным количеством итераций, например 30, это всегда выдает ошибку.Я чувствую, что я очень тупой, но я не понимаю.Спасибо за вашу помощь.