ZBLOG

#include #include #include #include using namespace std; template class terra_spin_queue { public: typedef typename std::queue queue_t; ...

以下是使用C++11提供的原子操作和无锁队列实现的优化代码:

#include #include #include #include

using namespace std;

template class terra_spin_queue { public:

void push(const T& value)
{
    while (true)
    {
        T* expected_tail = m_tail.load(memory_order_relaxed);
        if (m_tail.compare_exchange_weak(expected_tail, new T(value)))
        {
            expected_tail->next = nullptr;
            atomic_thread_fence(memory_order_release);
            m_tail.store(expected_tail->next, memory_order_relaxed);
            break;
        }
    }
}

bool try_pop(T& result)
{
    while (true)
    {
        T* expected_head = m_head.load(memory_order_relaxed);
        T* expected_tail = m_tail.load(memory_order_relaxed);

        if (expected_head == expected_tail) // queue is empty
            return false;

        T* expected_next = expected_head->next;

        if (m_head.compare_exchange_weak(expected_head, expected_next))
        {
            result = *expected_head;
            atomic_thread_fence(memory_order_acquire);
            delete expected_head;
            expected_head = nullptr;
            return true;
        }
    }
}

protected:

struct node
{
    T data;
    node* next;
    node(const T& value) : data(value), next(nullptr){}
};

atomic<node*> m_head;
atomic<node*> m_tail;

};

struct ttt {

char a[12];
int b; 

}; static terra_spin_queue global_queue;

void workTrheadFunc() {

int v=0;
while (true)
{
    ttt* val = new ttt;
    val->b = v++;
    global_queue.push(val);
    // std::this_thread::sleep_for(std::chrono::nanoseconds(1));
}

}

int main() {

thread workThread(workTrheadFunc);
while (true)
{
    ttt* i;
    if(global_queue.try_pop(i))
    {
        cout << "Consumer: " << i->b << endl;
        delete i;
        i = nullptr;
    }
}
workThread.join();

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1215

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?