加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

线程同步中一定得加锁吗

2023/03/02
1699
阅读需 2 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

线程同步中为了保护数据,使程序可以按照预想的方式运行,往往需要加锁。包括带判断的一读一写也一样

线程A:

if(test > 100)

{

testnum=test+10 ;

}
线程B:
test =test-20;

这个执行完线程A的if(test > 100)语句后再切换到线程B,执行test =test-20;然后再执行线程A的testnum=test+10 ;就与预期结果不符。可以通过加锁解决。

线程A:
加锁:
if(test > 100)
{
testnum=test+10 ;
}
解锁:
线程B:
加锁:
test =test-20;
解锁:

但是有的时候相关的赋值处于中断或者中断回调函数中,需要的锁或者临界区需要开关中断,频繁开关中断比较影响性能也不太好。可以通过线程或者中断的优先级来处理(中断的优先级肯定是比线程高的)。分两种情况:

读的优先级比写的高:

写了数据之后再立刻读,读完了再写。写完数据后通知读的线程运行,读的优先级较高(不会被写打断),这样通过优先级区分读写。

写的优先级比读高:

写的数据往往来源于中断之类的地方,优先级比较高也不该终止,这样将要读写的数据存入循环队列,这样通过读写队列中的不同位置来达到保证数据一致性的问题。

相关推荐

电子产业图谱