我希望在我的项目中尽可能减少同步并编写无锁代码.当绝对必要时,我喜欢用pthread和win32互斥锁替换原子操作中构建的轻量级自旋锁.我的理解是这些是下面的系统调用并且可能导致上下文切换(对于非常快速的关键部分而言,这可能是不必要的,其中简单地旋转几次将是更可取的).
我所指的原子操作在这里有很好的记录:http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Atomic-Builtins.html
这是一个例子来说明我在说什么.想象一下可能有多个读者和作者的RB树.RBTree :: exists()是只读且线程安全的,RBTree :: insert()需要单个编写器(而不是读者)的独占访问才是安全的.一些代码:
class IntSetTest
{
private:
unsigned short lock;
RBTree<int>* myset;
public:
// ...
void add_number(int n)
{
// Aquire once locked==false (atomic)
while (__sync_bool_compare_and_swap(&lock, 0, 0xffff) == false);
// Perform a thread-unsafe operation on the set
myset->insert(n);
// Unlock (atomic)
__sync_bool_compare_and_swap(&lock, 0xffff, 0);
}
bool check_number(int n)
{
// Increment once the lock is below 0xffff
u16 savedlock = lock;
while (savedlock == 0xffff || __sync_bool_compare_and_swap(&lock, savedlock, savedlock+1) == false)
savedlock …Run Code Online (Sandbox Code Playgroud)