加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 竞争原子操作可以相互挨饿吗?

发布时间:2020-12-16 03:36:20 所属栏目:百科 来源:网络整理
导读:想象一下有两个线程的程序.他们正在运行以下代码(CAS指的是 Compare and Swap): // Visible to both threadsstatic int test;// Run by thread Avoid foo(){ // Check if value is 'test' and swap in 0xdeadbeef while(!CAS(test,test,0xdeadbeef)) {}}//
想象一下有两个线程的程序.他们正在运行以下代码(CAS指的是 Compare and Swap):
// Visible to both threads
static int test;

// Run by thread A
void foo()
{
    // Check if value is 'test' and swap in 0xdeadbeef
    while(!CAS(&test,test,0xdeadbeef)) {}
}

// Run by thread B
void bar()
{
    while(1) {
        // Perpetually atomically write rand() into the test variable
        atomic_write(&test,rand());
    }
}

线程B是否有可能永久地导致线程A的CAS失败,从而永远不会将0xdeadbeef写入’test’?或者自然调度抖动是否意味着在实践中这种情况永远不会发生?如果在线程A的while循环中完成了一些工作怎么办?

解决方法

作为一个理论问题,是的.如果你能以某种方式管理这两个线程像这样以锁步方式运行
    time     thread A     thread B
    ----     --------     --------
     ||       CAS
     ||                   atomic_write
     ||       CAS
     /                   atomic_write

那么CAS永远不会真实.

实际上,当线程共享CPU / Core时,这种情况永远不会发生,而当线程在不同的CPU或内核上运行时,不太可能发生这种情况.在实践中,它不可能在超过几个周期内发生,并且天文学上不太可能发生超过调度器量子.

这就是这个代码

void foo()
{
    // Check if value is 'test' and swap in 0xdeadbeef
    while(!CAS(&test,0xdeadbeef)) {}
}

做它看起来做什么,即获取test的当前值,并将其与test进行比较以查看它是否已更改.在现实世界中,CAS的迭代将由执行实际工作的代码分开.需要使用volatile关键字来确保编译器在调用CAS之前获取测试,而不是假设它可能仍然存在于寄存器中的副本仍然有效.

或者您要测试的值不是test的当前值,而是某种最后已知的值.

换句话说,这个代码示例是对理论的测试,但是你不会在实践中使用这样的CAS,所以即使你可以让它失败,它也不一定告诉你它在使用时如何失败现实世界的算法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读