???????????????????????????У?
??????????????SMP??????CPU
??????????????CPU??
????????????????????????????????critical sections??????????????????????????????????????????У?????????????????????????critical sections??????????????е???????????????????????????????????”???”??????????????????????в????????Linux????н?????????????????ж????Ρ???????????????????????????????????????
?????ж????Σ?
??????÷???
????local_irq_disable() //?????ж?
????...
????critical section //?????
????...
????local_irq_enable() //???ж?
????local_irq_disable/enable?????/????CPU????ж????????SMP??CPU????????????????????????????????????????á?
????????????
???????????????е??????????????linux??????????е?????????????е???????????Щ???????2????????λ?????????????????????
?????????????????????????£?
????1.????????????????????
????void atomic_set(atomic_t *v ?? int i); //????????????i
????atomic_t v = ATOMIC_INIT(0); //??????????v????????0
????2.????????????
????atomic_read(atomic_t *v);
????3.?????????????
????void atomic_add(int i??atomic_t *v);//????????i
????void atomic_sub(int i ??atomic_t *v);//????????i
????4.??????????/???
????void atomic_inc(atomic_t *v);//????1
????void atomic_dec(atomic_t *v);//???1
????5.???????????????????????????????????м????????????0??????0????true????????false??
????int atomic_inc_and_test(atomic_t *v);
????int atomic_dec_and_test(atomic_t *v);
????int atomic_sub_and_test(int i ??atomic_t *v);
????6.??????????
????int atomic_add_return(int i ?? atomic_t *v);
????int atomic_sub_return(int i ?? atomic_t *v);
????int atomic_inc_return(atomic_t * v);
????int atomic_dec_return(atomic_t * v)??
??????? λ?????????£?
????// ????λ
????void set_bit(nr?? void *addr); // ????addr??????nrλ??????λд1
????// ???λ
????void clear_bit(nr?? void *addr); // ???addr??????nrλ??????λд0
????// ???λ
????void change_bit(nr?? void *addr); // ??addr??????nrλ???
????// ????λ
????test_bit(nr?? void *addr); // ????addr??????nrλ
????// ???????????????????test_bit(nr?? void *addr)???????xxx_bit(nr?? void *addr)
????int test_and_set_bit(nr?? void *addr);
????int test_and_clear_bit(nr?? void *addr);
????int test_and_change_bit(nr?? void *addr)