memcpy(a, b, sizeof(a));
v.s。
a[0] = b[0];
a[1] = b[1];
...
假设memcpy
应该具有更小的代码大小和更高的效率,但是在多线程系统中memcpy
是否存在任何风险?
答案 0 :(得分:5)
如果缓冲区是独占的,意味着线程不竞争访问复制中涉及的数据,那么memcpy
在多线程环境中使用是完全安全的。除修改目标缓冲区外,该函数没有持久状态,也没有其他副作用。
此外,只要没有线程尝试更改该缓冲区,您就可以安全地从任意数量的线程共享的缓冲区执行多线程复制。
但是,一旦写入的线程与任何共享缓冲区之间存在竞争,memcpy
就不再保证线程安全,即操作不是原子操作。除了2中描述的内容之外,在同一个缓冲区上运行的两个同时memcpy
会相互干扰并产生不可预测的结果。
答案 1 :(得分:1)
如果你不使用锁来确保排他性,使用memcpy()
只会非常危险! memcpy()
仅负责复制内存,不确保线程安全,您应自行添加锁定。在C语言中,在用户的空间中,您可以使用mutex
来确保排他性。