关于memcpy函数的任何多线程问题?

时间:2015-06-12 01:12:16

标签: c multithreading

memcpy(a, b, sizeof(a));

v.s。

a[0] = b[0];
a[1] = b[1];
...

假设memcpy应该具有更小的代码大小和更高的效率,但是在多线程系统中memcpy是否存在任何风险?

2 个答案:

答案 0 :(得分:5)

  1. 如果缓冲区是独占的,意味着线程不竞争访问复制中涉及的数据,那么memcpy在多线程环境中使用是完全安全的。除修改目标缓冲区外,该函数没有持久状态,也没有其他副作用。

  2. 此外,只要没有线程尝试更改该缓冲区,您就可以安全地从任意数量的线程共享的缓冲区执行多线程复制

  3. 但是,一旦写入的线程与任何共享缓冲区之间存在竞争,memcpy就不再保证线程安全,即操作不是原子操作。除了2中描述的内容之外,在同一个缓冲区上运行的两个同时memcpy会相互干扰并产生不可预测的结果。

答案 1 :(得分:1)

如果你不使用锁来确保排他性,使用memcpy()只会非常危险! memcpy()仅负责复制内存,不确保线程安全,您应自行添加锁定。在C语言中,在用户的空间中,您可以使用mutex来确保排他性。