My Python приложение создает массив, совместно используемый процессами, используя multiprocessing.RawArray
. Теперь, чтобы ускорить вычисления, я хочу изменить этот массив из функции C ++. Как безопасно передать указатель на базовую память в функцию C ++, которая принимает аргумент void *
?
Функция определена в файле pxd
как:
cdef extern from 'lib/lib.hpp':
void fun(void *buffer)
Моя наивная попытка до сих пор:
buffer = multiprocessing.RawArray(ctypes.c_ubyte, 10000)
clib.fun(ctypes.cast(self.queue_obj_buffer, ctypes.c_void_p))
Сбой компиляции Cython со следующей ошибкой: Cannot convert Python object to 'void *'
Я также попытался ctypes.addressof
с похожими результатами.
Я понимаю, что я потребуется метод для запроса этого указателя от каждого участвующего процесса индивидуально, потому что эта же область памяти будет отображаться по-разному в адресных пространствах процесса. Но это не проблема, пока я просто изо всех сил пытаюсь получить указатель вообще. Должен ли я вообще использовать другой подход и распределять разделяемую память изнутри C ++, или можно делать то, что я делаю?