当前位置: 首页 > news >正文

网站关键词放哪专业排名优化公司

网站关键词放哪,专业排名优化公司,网站功能介绍是什么,河北大型网站建设基本原理说明 在 x86 和 ARM 架构上#xff0c;原子操作通常利用硬件提供的原子指令来实现#xff0c;比如 LOCK 前缀#xff08;x86#xff09;或 LDREX/STREX#xff08;ARM#xff09;。以下是一些关键的原子操作#xff08;例如原子递增和比较交换#xff09;的汇…基本原理说明  在 x86 和 ARM 架构上原子操作通常利用硬件提供的原子指令来实现比如 LOCK 前缀x86或 LDREX/STREXARM。以下是一些关键的原子操作例如原子递增和比较交换的汇编实现。 1. x86 架构的原子操作 1原子递增 x86 的 LOCK 前缀可以用来保证指令在多核处理器上的原子性。例如原子递增操作 实现原子递增 global atomic_increment section .text atomic_increment:mov eax, 1 ; 设置递增值为 1lock xadd [rdi], eax ; 对地址 rdi 所指向的变量执行原子加操作add rax, 1 ; xadd 返回的是原值rax 原值 1ret解释 LOCK XADD [rdi], eax对 rdi 指向的地址执行原子加操作将原值存入 eax并把 eax 加上后写回 rdi。使用 LOCK 前缀可以保证多核环境下的原子性。 2比较并交换CAS x86 提供了 CMPXCHG 指令可以用来实现原子的比较并交换CAS。 实现原子 CAS global atomic_compare_exchange section .text atomic_compare_exchange:mov rax, rsi ; 将期望值放入 raxlock cmpxchg [rdi], rdx ; 如果 [rdi] 的值等于 rax期望值将 rdx 写入 [rdi]ret参数说明 rdi目标地址。rsi期望值。rdx需要交换的值。 解释 LOCK CMPXCHG [rdi], rdx 如果 [rdi] 的值等于 RAX则将 rdx 写入 [rdi]。否则将 [rdi] 的当前值写入 RAX。返回值RAX 中存储的是 rdi 的旧值调用者可以根据是否等于 rsi 判断交换是否成功。 2. ARM 架构的原子操作 ARM 使用 LDREX/STREX 指令对原子操作进行支持。这是一种 负载-存储排他模型可以保证在加载到存储之间没有其他线程或进程修改目标变量。 1原子递增 在 ARM 架构下使用 LDREX/STREX 实现原子递增 实现原子递增 .global atomic_increment atomic_increment:mov r1, #1 ; 将 1 存入 r1递增值 1:ldrex r0, [r0] ; 使用 LDREX 加载 [r0] 的值到 r0add r0, r0, r1 ; r0 r0 1strex r2, r0, [r0] ; 尝试将 r0 写回 [r0]如果成功 r2 0cmp r2, #0 ; 检查写入是否成功bne 1b ; 如果不成功重试dmb ; 数据内存屏障确保操作完成bx lr解释 LDREX加载目标地址的值同时标记为“独占”访问。STREX尝试存储值到目标地址如果目标地址在此期间被其他核修改存储操作会失败返回非 0。使用循环保证操作成功。 2比较并交换CAS 实现原子 CAS .global atomic_compare_exchange atomic_compare_exchange:ldrex r0, [r1] ; 从地址 r1 加载值到 r0旧值cmp r0, r2 ; 比较 r0 和 r2期望值bne 1f ; 如果不相等跳转到 1f返回旧值strex r3, r3, [r1] ; 尝试将 r3 写入 [r1]如果成功 r3 0cmp r3, #0 ; 检查是否存储成功bne atomic_compare_exchange ; 如果失败重新尝试 1:dmb ; 数据内存屏障保证一致性bx lr参数说明 r1目标地址。r2期望值。r3要交换的值。 解释 如果 LDREX 加载的值与 期望值r2相等则尝试存储 r3。如果存储失败则重复尝试。成功后返回原值。 3. 汇编操作的注意事项 x86 的强内存模型 x86 硬件有一个相对强的内存序很多情况下 LOCK 前缀可以满足原子操作需求。ARM 的弱内存模型 ARM 是弱内存模型使用 LDREX/STREX 操作时通常需要内存屏障如 DMB来确保指令顺序和数据同步。重试机制 对于 ARM 的 LDREX/STREX 模式如果存储失败需要通过循环重试。指令可用性 需要确保目标平台支持这些指令。比如 CMPXCHG 在早期的 x86 处理器如 80386上不可用。 4. 比较总结 操作x86ARM原子递增LOCK XADDLDREX ADD STREX原子比较交换LOCK CMPXCHGLDREX CMP STREX内存屏障MFENCE可选DMB x86 汇编通常较为简单因为其强内存序模型降低了编程复杂性ARM 则需要更明确的同步和屏障操作。 代码实现 my_atomic.h #include stdint.h #include stdio.h// 平台区分 #if defined(__x86_64__)#define ATOMIC_X86 #elif defined(__aarch64__)#define ATOMIC_ARM #else#error Unsupported platform #endif// x86 实现 #ifdef ATOMIC_X86// 原子递增 static inline int atomic_increment(int *addr) {int result;__asm__ __volatile__(lock xaddl %0, %1: r(result), m(*addr): 0(1): memory);return result 1; // 返回递增后的值 }// 原子递减 static inline int atomic_decrement(int *addr) {int result;__asm__ __volatile__(lock xaddl %0, %1: r(result), m(*addr): 0(-1) // 减 1: memory);return result - 1; // 返回递减后的值 }// 原子比较交换 static inline int atomic_compare_exchange(int *addr, int expected, int desired) {int old;__asm__ __volatile__(lock cmpxchgl %2, %1: a(old), m(*addr): r(desired), 0(expected): memory);return old; // 返回旧值 }// 原子读取 static inline int atomic_load(int *addr) {int value;__asm__ __volatile__(movl %1, %0: r(value): m(*addr): memory);return value; // 返回读取值 }#endif // ATOMIC_X86// ARM 实现 #ifdef ATOMIC_ARM// 原子递增 static inline int atomic_increment(int *addr) {int old, tmp;do {__asm__ __volatile__(ldrex %0, [%2] \n // 读取旧值到 oldadd %1, %0, #1 \n // tmp old 1strex %0, %1, [%2] \n // 尝试写回: r(old), r(tmp): r(addr): memory, cc);} while (old ! 0); // 如果写失败重试return tmp; // 返回递增后的值 }// 原子递减 static inline int atomic_decrement(int *addr) {int old, tmp;do {__asm__ __volatile__(ldrex %0, [%2] \n // 读取旧值到 oldsub %1, %0, #1 \n // tmp old - 1strex %0, %1, [%2] \n // 尝试写回: r(old), r(tmp): r(addr): memory, cc);} while (old ! 0); // 如果写失败重试return tmp; // 返回递减后的值 }// 原子比较交换 static inline int atomic_compare_exchange(int *addr, int expected, int desired) {int old, status;do {__asm__ __volatile__(ldrex %0, [%2] \n // 加载到 oldcmp %0, %3 \n // 比较 old 和 expectedbne 1f \n // 如果不相等跳转到 1strex %1, %4, [%2] \n // 尝试写回 desired1:: r(old), r(status): r(addr), r(expected), r(desired): memory, cc);} while (status ! 0); // 如果写失败重试return old; // 返回旧值 }// 原子读取 static inline int atomic_load(int *addr) {int value;__asm__ __volatile__(ldrex %0, [%1] \n // 加载值到 value: r(value): r(addr): memory);return value; // 返回读取值 }#endif // ATOMIC_ARMmy_atomic_test.c #include pthread.h #include stdio.h #include stdlib.h #include my_atomic.h#define NUM_THREADS 4 #define ITERATIONS 1000volatile int shared_counter 0; // 全局共享计数器// 线程函数执行递增操作 void* thread_increment(void* arg) {for (int i 0; i ITERATIONS; i) {atomic_increment((int*)shared_counter);}return NULL; }// 线程函数执行递减操作 void* thread_decrement(void* arg) {for (int i 0; i ITERATIONS; i) {atomic_decrement((int*)shared_counter);}return NULL; }int main() {pthread_t threads[NUM_THREADS];// 创建增量线程for (int i 0; i NUM_THREADS / 2; i) {if (pthread_create(threads[i], NULL, thread_increment, NULL) ! 0) {perror(pthread_create);exit(EXIT_FAILURE);}}// 创建减量线程for (int i NUM_THREADS / 2; i NUM_THREADS; i) {if (pthread_create(threads[i], NULL, thread_decrement, NULL) ! 0) {perror(pthread_create);exit(EXIT_FAILURE);}}// 等待所有线程完成for (int i 0; i NUM_THREADS; i) {pthread_join(threads[i], NULL);}// 最终结果int final_value atomic_load((int*)shared_counter);printf(最终计数器值: %d\n, final_value);return 0; }ubuntu x86编译运行 $ gcc -pthread -o a.out my_atomic_test.c $ ./a.out 最终计数器值: 0 gitlab.0voice.com
http://www.hkea.cn/news/14319780/

相关文章:

  • 网站建设源代码 费用wordpress侧边栏导航
  • 网站开发软件和工具ide和编辑器湖北省建设用地预审网站
  • 网站建设的软件平台石家庄最好的网站建设公司
  • 有什么网站可以做微信支付宝wp rocket wordpress
  • 市场推广计划书太原百度seo优化推广
  • 网站二维码悬浮wordpress 自定义鼠标
  • 模板的网站都有哪些域名解析错误是怎么回事
  • 佛山做网站公司排名国外最大的素材网站
  • 建站快车品牌代码写好了怎么做成网页
  • 学院网站建设服务招生宣传微信公众号开发网站开发
  • 企业信息公开网站wordpress 体育主题公园
  • 重庆网站设计公司排名wordpress分类目录keyword
  • 网站规划与建设课程设计网站前端设计外包公司
  • 网站开发预算编制图像编辑器
  • 如何规划一个网站中国建设人才网信息网证书如何查询
  • 大连仟亿科技网站建设公司怎么样网页设计与制作图片素材
  • 萍乡网站seo怎样营销建设网站
  • 无锡网站制作哪家公司好wordpress admin ajax
  • 如何做网站焦点图设计公司怎么接业务
  • 网站建设入门做网站多少钱西宁君博领衔
  • 婴儿做相册的网站开发公司对外房屋销售优惠政策
  • 土特产网站建设事业计划书wordpress 文章 列表
  • vultr做网站保定百度推广排名
  • 义乌建站软件研发和开发的区别
  • 好点的开发网站的公司比分网站仿站建设
  • 设计门户网站网站建设找朝云科技
  • 陕西网站制作淮北之窗
  • php网站建设招聘品牌宣传推广方案
  • 网站推广总结网站谁做的比较好
  • 网站联系我们页面阿里云搜索引擎