linux - Intel 的hardware transactional memory接口 _xbegin() 返回结果为0
PHP中文网
PHP中文网 2017-04-17 15:20:20
[Linux讨论组]

我在学习使用intel 的Transactional Synchronization Extensions即硬件事务内存。
新的gcc版本应该直接支持:gcc htm

里面的函数_xbegin()如果出错应该有一个返回码。但是我现在发现有很大的概率直接返回0.也就是说没有任何错误码出现。

下面贴上我的测试代码,模拟银行转账:


void* f1(bank_t* bank, int id){
    for(int i=0; i<5000000; i++){
        int src = rand()%bank->size;
        int dst = rand()%bank->size;
        //printf("src %d dst %d\n", src, dst);
        while(src == dst){
            dst = rand()%bank->size;
        }
        unsigned stat = _xbegin();
        if(stat == _XBEGIN_STARTED){
            bank->accounts[src].balance--;
            bank->accounts[dst].balance++;
            _xend();
            tx[id]++;
        }else{
            _abort[id]++;
            if (stat & _XABORT_CONFLICT){
                conflict[id]++;
            }
            if (stat & _XABORT_CAPACITY){
                capacity[id]++;
            }
            if (stat & _XABORT_DEBUG){
                debug[id]++;
            }
            if (stat & _XABORT_RETRY == 0){
                failed[id]++;
            }
            if (stat & _XABORT_NESTED){
                printf("[ PANIC ] _XABORT_NESTED\n");
                exit(-1);
            }
            if (stat & _XABORT_EXPLICIT){
                printf("[ panic ] _XBEGIN_EXPLICIT\n");
                exit(-1);
            }
            if (stat == 0){
            //    printf("[ panic] stat is zero\n");
            //    exit(-1);
            }
        }
    }
    return NULL;
}

因为经常返回0,也就是transaction失败了,所以性能会很差。我想知道有没有人遇到类似的问题。

PS:还有一个奇怪的现象就是失败的概率取决于上面的loop循环的大小,如果循环太多了,失败率就上去了;如果循环次数很小,基本不会出错。

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号