小编Tho*_*mas的帖子

从GCC原子操作构建的轻量级自旋锁?

我希望在我的项目中尽可能减少同步并编写无锁代码.当绝对必要时,我喜欢用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)

c++ multithreading gcc pthreads thread-safety

11
推荐指数
1
解决办法
8175
查看次数

标签 统计

c++ ×1

gcc ×1

multithreading ×1

pthreads ×1

thread-safety ×1