加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

仅在加入/减少变量时是否需要互斥锁?

发布时间:2020-12-16 10:36:45 所属栏目:百科 来源:网络整理
导读:我有一个带有一些整数字段的结构,比如 struct s { int a; int b; int c; int max;};struct s mystruct = {0,0}; // Global var 然后我有N个线程,有时必须做的事情,或者 – 在前三个字段,有时必须读取它们然后更新最大字段.我必须在这里使用互斥吗?如果是的
我有一个带有一些整数字段的结构,比如

struct s {
    int a;
    int b;
    int c;
    int max;
};
struct s mystruct = {0,0}; // Global var

然后我有N个线程,有时必须做的事情,或者 – 在前三个字段,有时必须读取它们然后更新最大字段.我必须在这里使用互斥吗?如果是的话,只有在读取/更新max或者总是吗?为什么?如果我只是增加或减少前三个字段,那么一个线程在另一个之前运行是否重要?

解决方法

如果您执行的操作不是原子操作,则需要同步对变量的访问.
考虑单个变量a具有初始值(例如5)的场景.
现在我们有两个线程T1和T2,都希望增加它.增量操作如何分解,以防它不是原子的(只是一个例子,它可能是其他方式)?

1)将值读入临时位置.
2)增加并将临时位置写回.

现在考虑一个场景T1首先执行此操作,然后在完成步骤1之后由T2抢占:

T1:1)读入temp1 => temp1目录= 5
T2:1)读入temp2 => TEMP2 = 5
T2:2)将temp2 1写入a =>一个= 6
T1:2)将temp1 1写入a =>一个= 6

因此,a的最终值将是6而不是7,正如您所期望的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读