gpt4 book ai didi

c - 使用互斥锁的 getter 和 setter 最佳实践

转载 作者:行者123 更新时间:2023-12-04 10:38:16 25 4
gpt4 key购买 nike

在嵌入式编程中使用多个线程时,我感觉有点不知所措,因为每个共享资源最终都有一个受互斥锁保护的 getter/setter。

我真的很想了解是否有以下类型的 setter/getter

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());
}

我问这个是因为我无缘无故地按顺序锁定和重新锁定同一个互斥锁。

最佳答案

if float assignement can be considered atomic



除非您使用 C11 _Atomic,否则 C 中没有任何东西可以被视为原子或内联汇编器。底层硬件无关紧要,因为即使可以在给定硬件上的单个指令中读取特定大小的字,也永远无法保证某个 C 指令只会产生单个指令。

does it make any sense to do

os_mutex_get(mutex, OS_WAIT_FOREVER);
int la = a;
int lb = b;
int lc = c;
os_mutex_put(mutex);
foo(a,b,c);


假设您的意思是 foo(la,lb,lc); ,那么是的,这很有意义。这就是您应该如何理想地使用互斥锁:最小化互斥锁之间的代码,以便它只是原始变量复制而不是其他任何东西。

关于c - 使用互斥锁的 getter 和 setter 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60060545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com