不同的线程访问同一个结构体不同的成员变量,需要加锁吗?

fanting247615584 2016-03-18 03:56:09
例如结构体a 有两个成员变量b,c,线程分别是thread1 ,thread2.thread1 里操作a.b ,thread2 操作a.c 。两个线程需要多这两个变量加一把锁么?
...全文
1750 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
encoderlee 版主 2016-03-19
  • 打赏
  • 举报
回复

struct MyStruct
{
int n;
int k;
};

void main()
{
MyStruct s;
s.n = 5;
s.k = 10;
}

s.n = 5 和 s.k = 10 这两条语句实际上是对两个不同的内存地址进行写操作,相当于对两个不同的变量进行操作。所以在两个线程中同时进行也无需加锁。
不过还是要具体问题具体分析,如果结构体中的两个变量并非简单的int,而分别是结构体或C++对象,这些结构体或对象中又有指针,这些指针又指向了同一个东西,就容易出问题。
另外还要考虑两个变量在逻辑上有无约束关系,比如一个结构体,代表一个三角形,a、b、c分别为三边边长:

struct Triangle
{
int a;
int b;
int c;
};

两个线程同时访问一个Triangle对象,某一个时刻,这个三角形a=5 b=5 c = 5
线程A检查了a、b的值后,准备把c的值改为9,线程A认为这样这个三角形将变成(5,5,9),单线程环境下,当然没什么问题。
但此时线程B也在进行类似的操作,线程B检查了b、c的值后,准备把a改为2,线程B认为这样这个三角形将变成(2,5,5)。
好了,最终两个线程把三角形变成了(2,5,9)
然后再接下来调用一些求角度,求面积的函数时,会发生什么情况,多半要程序奔溃
fanting247615584 2016-03-18
  • 打赏
  • 举报
回复
您的意思是纯C的结构体么
jiqiang01234 2016-03-18
  • 打赏
  • 举报
回复
仅限pod结构体,而且不能含有union和bit field
fanting247615584 2016-03-18
  • 打赏
  • 举报
回复
这和多个线程访问对象的不同成员变量是类似的情况的吧,只要在不同的线程里访问对象或结构体的不同成员,就不会出现脏读,或半读的情况吧。 这个有什么理论依据么?
fanting247615584 2016-03-18
  • 打赏
  • 举报
回复
但如果结构体不是对齐的,不担心在取a这个结构体对象时存在冲突么 thread1() { lock() a.b unlock() } thread1() { lock() a.c unlock() } 这样真的没有必要么?
jiqiang01234 2016-03-18
  • 打赏
  • 举报
回复
没必要,同一个变量只有在不同的线程同时操作才需要保护

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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