c - 使用中断或线程和全局变量进行优化
问题描述
我发现我在如何最好地编写超出正常代码流的函数之间的通信时遇到了一些困难。一个简单的例子是:
int a = 0;
volatile int v = 0;
void __attribute__((used)) interrupt() {
a++;
v++;
}
int main() {
while(1) {
// asm("nop");
a--;
v--;
if (v > 10 && a > 10)
break;
}
return 0;
}
a
主 while 循环可以将变量优化为寄存器,因此从中断中看不到任何变化,这并不奇怪。如果变量是易失的,那么每次使用它时都需要从内存中重新读取或重写到内存中,这很烦人。在该技术中,跨线程的任何通信变量都需要是易失的。同步原语(甚至是注释掉的“nop”)解决了这个问题,因为它似乎具有创建编译器屏障的副作用。但是,如果我理解正确,这将意味着刷新 main 中使用的所有寄存器的整个状态,在这种情况下,将一些变量设置为 volatile 可能不那么苛刻。我目前使用这两种技术,但我希望我有一个更标准的方法来处理这个问题。
解决方案
a
因此,您需要一种减少查找次数的方法。以下将其减少为一次循环:
volatile int a = 0;
volatile int v = 0;
void __attribute__((used)) interrupt() {
a++;
v++;
}
int main() {
while(1) {
int b = --a;
--v;
if (v > 10 && b > 10)
break;
}
return 0;
}
没有什么能阻止您进行类似的检查。
推荐阅读
- sql - CTE 表优化
- r - 创建一个 ETF 投资组合 csv 数据
- postgresql - UTC [38] 错误:无法获得与“ir_cron”相关的行的锁定(在 Fetchmail 服务操作之后)
- vue.js - 使用 v-select multiple 时无法更新数据
- ios - 使用 swift 放大到 PDFKit 中的特定坐标
- android - 如何解决 err_unknown_url_scheme?
- php - 如何在 lighttpd 上将 ectension .php 更改为例如 .123
- azure-cosmosdb - 如何递归计算子文档
- javascript - 机器人正常运行时间 Discord.JS
- c# - 如何完全验证 X509 证书?