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

来自atomic.h的操作似乎是非原子的

发布时间:2020-12-14 16:29:35 所属栏目:Java 来源:网络整理
导读:以下代码为n和v都产生随机值,这并不奇怪,n是没有被正确保护的随机值.但是假设v应该终于为0.我的代码有什么问题吗?还是有人可以为我解释一下吗?谢谢. 我正在开发x86架构的4核服务器. uname如下. Linux 2.6.9-22.ELsmp#1 SMP Mon Sep 19 18:00:54 EDT 2005 x
以下代码为n和v都产生随机值,这并不奇怪,n是没有被正确保护的随机值.但是假设v应该终于为0.我的代码有什么问题吗?还是有人可以为我解释一下吗?谢谢.

我正在开发x86架构的4核服务器. uname如下.

Linux 2.6.9-22.ELsmp#1 SMP Mon Sep 19 18:00:54 EDT 2005 x86_64 x86_64 x86_64 GNU / Linux

#include <stdio.h>
#include <pthread.h>
#include <asm-x86_64/atomic.h>

int n = 0;
atomic_t v;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

#define LOOP 10000

void* foo(void *p)
{
    int i = 0;
    for(i = 0; i < LOOP; i++) {
//        pthread_mutex_lock(&mutex);
        ++n;
        --n;
        atomic_inc(&v);
        atomic_dec(&v);
//        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

#define COUNT 50

int main(int argc,char **argv)
{
    int i;
    pthread_t pids[COUNT];
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    atomic_set(&v,0);

    for(i = 0; i < COUNT; i++) {
        pthread_create(&pids[i],&attr,foo,NULL);
    }

    for(i = 0; i < COUNT; i++) {
        pthread_join(pids[i],NULL);
    }

    printf("%dn",n);
    printf("%dn",v);
    return 0;
}

解决方法

我们可以看看代码的汇编器输出(gcc -E,我想).甚至认为uname表示它是SMP感知的,这并不一定意味着它是用CONFIG_SMP编译的.

没有了,汇编代码输出没有锁前缀,你可以发现你的内核相互干扰.

但是我会使用pthread函数,因为它们可以在更多的平台上移植.

(编辑:李大同)

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

    推荐文章
      热点阅读