在嵌入式编程中使用多个线程时,我感到有点不知所措,因为每个共享资源最终都带有一个受互斥锁保护的 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);
只锁定变量的副本而不是完全执行?
EDIT2:鉴于“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());
}
我问这个是因为我无缘无故地顺序锁定和重新锁定同一个互斥锁。