c - 如何原子地执行一小段 C 代码

标签 c process atomic

我有这段C代码:

// ... many stuff here ...
if ( ((*(ptr + 0xffce)) & 3) ) {
     *(ptr + 0xffce) |= 3;
     *(ptr + 0xd415) = 1 << var;
}
// ... many stuff here ...

其中一些位被逻辑链接,结果值被写入内存。

对于我的程序,在执行此程序部分期间不占用 CPU 是至关重要的。因此,它必须原子 执行并且以代码块不可分割的方式运行。只应允许调度程序在此 if block 之前或之后占用 CPU。

如何在普通 Linux 生态系统(使用用户空间程序)上实现这一目标?

编辑: 下面的评论表明,如果 CPU 可能不会被调度程序分散注意力,可能无法执行代码块。相反的问题是:通常有可能实现这个目标吗?我需要为此做什么?

最佳答案

一般来说,写入硬件应该放在内核模块中。如果平台受 MMU 或其他内存管理保护,则您显示的代码(写入硬件地址)将无法在用户空间中运行。理论上,用户地址空间实际上不同于内核地址空间。

在内核模式下,解决方案很可能会自行呈现。内核中有许多计时/保护机制:preempt_disable、spin_locks、in_atomic、中断、高优先级内核计时器等等。

一般您可以通过在给定平台上禁用所有中断来实现您想要做的事情。这通常需要 RTOS 或内核代码。 (禁用所有中断也会阻止调度程序运行。)但是,在大多数平台中,这是不受欢迎的。 (有充分的理由。)所以你必须按照平台指南去做。 “preempt_disable”是一个很好的例子,说明如何在不禁用所有其他程序的情况下禁用调度程序。

关于c - 如何原子地执行一小段 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687010/

相关文章:

c - 使用 sprintf() 将整数保存到字符串数组中

c# - 使用进程时程序不会终止

windows - 如何使用Powershell强制终止进程?

java - 非同步i++是否重叠?

assembly - ARM Cortex M3 上的原子 int64_t

multithreading - 原子操作在进程间的工作方式是否与在线程间的工作方式相同?

c++ - 将数组中的简单数据类型移动到特定位置的最快方法

c - 使用 %*[^|] 分隔符时 sscanf() 是否从标准输入中删除字符?

c++ - 正在使用的文件 C/C++

python中使用psutil的单个进程的内存使用情况(以字节为单位)