如何在 C 语言中执行原子增量和获取?
- 2024-11-11 08:27:00
- admin 原创
- 48
问题描述:
我正在寻找一种方法来自动增加一个短整型数,然后返回该值。我需要在内核模式和用户模式下执行此操作,因此它是在 Linux 下、在 Intel 32 位架构上使用 C 语言编写的。不幸的是,由于速度要求,互斥锁不是一个好的选择。
还有其他方法可以做到这一点吗?目前,似乎唯一可用的选项是内联一些程序集。如果是这样,有人可以给我指出适当的说明吗?
解决方案 1:
GCC__atomic_*
内置功能
从 GCC 4.8 开始,__sync
内置函数已被弃用,取而代之的是__atomic
内置函数: https: //gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html
它们实现 C++ 内存模型,并std::atomic
在内部使用它们。
以下 POSIX 线程示例++
在 x86-64 上始终失败,但在 上始终有效_atomic_fetch_add
。
主程序
#include <assert.h>
#include <pthread.h>
#include <stdlib.h>
enum CONSTANTS {
NUM_THREADS = 1000,
NUM_ITERS = 1000
};
int global = 0;
void* main_thread(void *arg) {
int i;
for (i = 0; i < NUM_ITERS; ++i) {
__atomic_fetch_add(&global, 1, __ATOMIC_SEQ_CST);
/* This fails consistently. */
/*global++*/;
}
return NULL;
}
int main(void) {
int i;
pthread_t threads[NUM_THREADS];
for (i = 0; i < NUM_THREADS; ++i)
pthread_create(&threads[i], NULL, main_thread, NULL);
for (i = 0; i < NUM_THREADS; ++i)
pthread_join(threads[i], NULL);
assert(global == NUM_THREADS * NUM_ITERS);
return EXIT_SUCCESS;
}
编译并运行:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out ./main.c -pthread
./main.out
反汇编分析:如何用纯 C 语言启动线程?
在 Ubuntu 18.10、GCC 8.2.0、glibc 2.28 中测试。
C11_Atomic
在 5.1 中,上述代码适用于:
_Atomic int global = 0;
global++;
并且 C11threads.h
已添加到 glibc 2.28 中,它允许您在纯 ANSI C 中创建线程,而无需 POSIX,最小可运行示例:如何用纯 C 启动线程?
解决方案 2:
GCC支持原子操作:
gcc 原子
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD