booleanTestAndSet (boolean *target){
boolean rv = *target;
*target = TRUE;
return rv;
}
do{
while(TestAndSet(&lock));
criticalsection;//临界区
lock= FALSE;
remaindersection;//剩余区
}while (TRUE);
一个线程运行到while(TestAndSet(&lock))这句的时候,
如果criticalsection没有被锁住,即lock值为false,那么传入TestAndSet()的参数为false,**①在函数体内:rv先被赋为false,然后*target被赋为true,然后返回rv(值为false)。运行的结果为:返回值为false,使线程跳出while循环,得以进入criticalsection;同时参数(即lock)被改为true,表示criticalsection被锁住,**其他线程在当前线程没有出criticalsection之前(即运行lock=false这句之前),不能进入criticalsection。为什么呢,下面说
如果线程运行到while(TestAndSet(&lock))时,criticalsection被锁住了,即lock值为true,那么证明有其他线程在运行criticalsection的代码(如第一步所说),那么传入TestAndSet()函数的值为true,**②在函数体内:*target为传入的值(true),rv被赋为true,*target被赋值为true(原来就是true,赋值不改变什么),返回rv。那么运行结果是返回值是rv(true),lock也是true。因为返回值是true,所以while继续运行,lock还是true,**所以传入TestAndSet()的参数依然是true。在上一句②的过程又重新运行一遍,然后一遍又一遍。所以这个线程一直在while这里一直运行,不能进入criticalsection。
直到在criticalsection中的那个线程运行完criticalsection中的代码,即运行到lock=false这句,lock被赋为false。这时比较关键了,while中再次运行TestAndSet()的时候传入的参数变成了false,那么第一段中①中的过程会运行一遍,即返回值为false,在while中运行了无数次的进程可以跳出while,进入criticalsection,lock又重新被赋为true,即锁住criticalsection,其他进程此时不能进入。
所以“这条语句”的作用就是:如果当前criticalsection被锁定,那么在这里等,直到解锁;如果没有被锁定,当前进程可以进入criticalsection,同时锁定criticalsection。
之所以叫硬同步,是因为TestAndSet()函数中的三条语句是由硬件保证同步的,即硬件保证这三条语句必须原子运行,中间不发生任何中断,如同一条语句。之所以这样保证,是因为函数体内本身就是一个criticalsection,在多线程程序中,如果在这几条语句中间被中断,也会有race condition发生。