• 正文
  • 相关推荐
申请入驻 产业图谱

线程同步中一定得加锁吗

2023/03/02
675
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

线程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;
解锁:

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

读的优先级比写的高:

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

写的优先级比读高:

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

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录