我用 C/C++ 编写了一个软件,使用了很多 BIAS/Profil,一个区间代数库。在我的算法中,我有一个主控,它划分一个域并将它的一部分提供给从属进程。那些返回关于这些域部分的 int 法规。有共同的数据可供阅读,仅此而已。
我需要并行化我的代码,但是只要 2 个从属线程正在运行(或者我猜想更多)并且都在调用这个库的函数,它就会出现段错误。这些段错误的特殊之处在于,gdb 很少从两个构建中指示相同的错误行:它取决于线程的速度,如果一个更早开始,等等。我尝试让线程屈服,直到从主人,它“稳定”了错误。我相当确定它来自对库的 memcpy 的调用(在 gdb 回溯之后,我总是以调用 memcpy 的 BIAS/Profil 函数结束。公平地说,几乎所有函数都临时调用 memcpy返回结果之前的对象...)。从我在网上阅读的内容来看,memcpy() 似乎不是线程安全的,)。(对于一个应该只读取共享数据的函数来说似乎很奇怪......或者在编写线程数据时,两个线程都使用相同的内存空间?)
为了解决这个问题,我想“替换”(至少用于测试行为是否发生变化)对 memcpy 的调用以进行互斥体框架调用。(类似于 mtx.lock();mempcy(...);mtx.unlock();)
第一个问题:我根本不是开发/代码工程师,并且缺乏很多基础知识。我认为当我使用预构建的 BIAS/Profil 库时,调用的 memcpy 是构建库的系统之一,对吗?如果是这样,如果我尝试从系统上的源代码构建库,它会改变什么吗?(我不确定我是否可以构建这个库,因此提出了这个问题。)
第二个问题:在我的 string.h 中,memcpy 由以下方式声明:
#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 行代码一起工作;)
有更好的主意吗?(这会让我很开心......)