【发布时间】:2020-05-20 11:13:07
【问题描述】:
在嵌入式编程中使用多个线程时,我感到有点不知所措,因为每个共享资源最终都会有一个受互斥体保护的 getter/setter。
我真的很想了解以下类型的吸气剂
static float static_raw;
float get_raw() {
os_mutex_get(mutex, OS_WAIT_FOREVER);
float local_raw = static_raw;
os_mutex_put(mutex);
return local_raw ;
}
有意义,或者float 赋值是否可以被认为是原子的,例如对于 ARM(不同于例如 64 位变量),这就显得多余了。
我可以这样理解:
raw = raw > VALUE ? raw + compensation() : raw;
值被多次处理的地方,但是读取或返回的时候呢?
你能说清楚吗?
编辑 1: 关于下面的第二个问题。 假设我们在时间执行方面有一个“重”函数让我们称之为
void foo(int a, int b, int c)
其中 a,b,c 是来自共享资源的潜在值。 当 foo 函数被调用时,它是否应该被一个互斥锁包围,即使它只需要一个值的副本,也要将其锁定足够长的时间?例如
os_mutex_get(mutex, OS_WAIT_FOREVER);
foo(a,b,c);
os_mutex_put(mutex);
这样做有意义吗
os_mutex_get(mutex, OS_WAIT_FOREVER);
int la = a;
int lb = b;
int lc = c;
os_mutex_put(mutex);
foo(la,lb,lc);
只锁定变量的副本而不是完整的执行?
编辑2: 鉴于“a”、“b”和“c”可能存在 getter 和 setter。 这样做在性能/或其他方面是否有问题?
int static_a;
int get_a(int* la){
os_mutex_get(mutex, OS_WAIT_FOREVER);
*la = static_a;
os_mutex_put(mutex);
}
或
int static_b;
int get_b(){
os_mutex_get(mutex, OS_WAIT_FOREVER);
int lb = static_b;
os_mutex_put(mutex);
return lb;
}
把它们当作
void main(){
int la = 0;
get_a(&la);
foo(la,get_b());
}
我问这个是因为我无缘无故地依次锁定和重新锁定同一个互斥锁。
【问题讨论】:
标签: c embedded race-condition freertos shared-resource