Я чувствую себя немного ошеломленным, когда использую несколько потоков во встроенном программировании, так как каждый разделяемый ресурс заканчивается геттером / сеттером, защищенным мьютексом.
Мне бы очень хотелось понять, получаю ли геттер следующего вида
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
можно считать атомом c, например, для 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". Это проблематично c с точки зрения производительности / или чего-то еще при выполнении чего-то подобного?
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());
}
Я спрашиваю об этом, потому что я блокирую и повторно блокирую один и тот же мьютекс последовательно, без какой-либо причины.