线程同步中为了保护数据,使程序可以按照预想的方式运行,往往需要加锁。包括带判断的一读一写也一样
线程A:
if(test > 100)
{
testnum=test+10 ;
}
线程B:
test =test-20;
线程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;
解锁:
加锁:
if(test > 100)
{
testnum=test+10 ;
}
解锁:
线程B:
加锁:
test =test-20;
解锁:
但是有的时候相关的赋值处于中断或者中断回调函数中,需要的锁或者临界区需要开关中断,频繁开关中断比较影响性能也不太好。可以通过线程或者中断的优先级来处理(中断的优先级肯定是比线程高的)。分两种情况:
读的优先级比写的高:
写了数据之后再立刻读,读完了再写。写完数据后通知读的线程运行,读的优先级较高(不会被写打断),这样通过优先级区分读写。
写的优先级比读高:
写的数据往往来源于中断之类的地方,优先级比较高也不该终止,这样将要读写的数据存入循环队列,这样通过读写队列中的不同位置来达到保证数据一致性的问题。
阅读全文