锁。一种需要拷贝、一种粒度较大。两者如何选择?

千梦一生 2020-08-03 12:31:05
对所说的。锁操作细粒度。我得认识是:锁住的代码尽量少。
-----------------------------
现在有一个结构体structA要跨线程读写。我为其上锁
写:
mutex.lock()
memcpy(&structA,source,length);
mutex.unlock();

写操作具体:

循环()
{
if(getstructA().a)
xxxxxx;
if(getstructA().b)
xxxxxx;
if(getstructA().c)
xxxxxx;
}
...


A:我的getstructA是引用出来的,还是处于临界区中的数据。因此我选择对第二个整个code上锁。
B:如果我getstructA和写操作一样是拷贝出来的,那在其上下加速即可。非常安全。看上去不错。

A方式看上去占了太多时间片,粒度似乎大。B需要copy、占时间也占空间。
就这个场景而言这,二者孰优孰劣呢?或者除此以外是否还有更合适的同步方式?谢谢各位
...全文
78 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
千梦一生 2020-08-03
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
锁的粒度小是为了避免其他线程等待太久,影响多线程效率。
你这个问题,关键是看你的业务需求和实际测试情况而定。B方式生成的拷贝,写完数据要合并到原来的structA吗?如果要合并,那即使提高了并行效率,后面的合并也是瓶颈;如果不需要合并,那就要测试最大并行数会产生多少strcutA副本,实际占用多少内存,如果内存占用不影响系统运行,那就牺牲空间换时间;如果占用过多内存会导致系统资源殆尽,如内存溢出,宕机等等,那就不可取。

谢谢。
这第二个代码写错了,那儿是读structA相关的代码。
不过看了您的回复后有所想法。决定使用getstruct从structA拷贝出来。内存占用确实不大。甚至事实上面临的情况是线程都只有一读一写
qybao 2020-08-03
  • 打赏
  • 举报
回复
锁的粒度小是为了避免其他线程等待太久,影响多线程效率。 你这个问题,关键是看你的业务需求和实际测试情况而定。B方式生成的拷贝,写完数据要合并到原来的structA吗?如果要合并,那即使提高了并行效率,后面的合并也是瓶颈;如果不需要合并,那就要测试最大并行数会产生多少strcutA副本,实际占用多少内存,如果内存占用不影响系统运行,那就牺牲空间换时间;如果占用过多内存会导致系统资源殆尽,如内存溢出,宕机等等,那就不可取。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧