Я пишу программное обеспечение на C/C++, используя библиотеку интервальных алгебр BIAS/Profil. В моем алгоритме у меня есть мастер, который делит домен и передает его части в подчиненный процесс. Те возвращают int закон об этих доменах. Есть общие данные для чтения, и все.memcpy [или нет?] И многопоточность [std :: thread from C++ 11]
Мне нужно распараллелить мой код, однако, как только 2 подчиненных потока работают (или, более того, я думаю), и оба вызывающие функции этой библиотеки, это segfaults. Что характерно для этих segfaults, заключается в том, что gdb редко указывает одну и ту же линию ошибок из двух сборок: она зависит от скорости потоков, если она была запущена раньше и т. Д. Я попытался получить поток, пока не появится мастер, он «стабилизирует» ошибку. Я уверен, что это происходит из вызовов в memcpy библиотеки (после backtrace gdb, я всегда оказываюсь в функции BIAS/Profil, вызывающей memcpy. Чтобы быть справедливым, почти все функции называют memcpy временным объект перед возвратом результата ...). Из того, что я читал в Интернете, казалось бы, что memcpy() не может быть потокобезопасным, в зависимости от реализаций (особенно here). (Кажется странным, что функция должна читать только общие данные ... или, может быть, при написании потоков данных оба потока идут на одно и то же пространство памяти?)
Чтобы попытаться решить эту проблему, я бы хотел для «замены» (по крайней мере, для тестов, если изменения поведения) вызов memcpy для вызова с мьютексом. (что-то вроде mtx.lock(); mempcy (...); mtx.unlock();)
1-й вопрос: я вообще не разработчик dev/code и нехватка базовых знаний. Я думаю, что, когда я использую предварительно созданную библиотеку BIAS/Profil, memcpy называется одной из систем, на которой была построена библиотека, правильно? Если это так, изменилось бы это, если бы я попытался создать библиотеку из источника в моей системе? (Я не уверен, что может построить эту библиотеку, следовательно, вопрос.)
второго вопроса: в моем string.h, тетср объявлен: #ifndef __HAVE_ARCH_MEMCPY
extern void * memcpy(void *,const void *,__kernel_size_t);
#endif
и в некоторых других струнных заголовках (string_64.h , string_32.h) определение формы: #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len))
или еще более четкое определение или просто объявление, подобное цитируемому. Он начинает казаться уродливым, но, в идеале, я хотел бы создать препроцессорную переменную #define __HAVE_ARCH_MEMCPY 1
и void * memcpy(void *,const void *,__kernel_size_t)
, которая будет делать memcpy с мьютекс-рамкой с утерянной memcpy. Идея здесь состоит в том, чтобы избежать возиться с библиотекой и заставить ее работать с 3 строками кода;)
Любая идея? (Это сделало бы мой день ...)
C/C++ не существует. Ваша тегировка с C, но ваш заголовок ссылается на C++ –
@Jens: он мог писать на C++ и вызывать функцию C из своих файлов на C++. – Jimbo