Я хотел бы изменить некоторые элементы структуры атомарно. В моей текущей реализации используются мьютексы для защиты критического кода, и это видно ниже.Как изменить структурные элементы атомарно, не используя блокировки в C?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>
pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
#define ITER 100000
typedef struct global_status {
int32_t context_delta;
uint32_t global_access_count;
} global_status_t;
global_status_t g_status;
void *context0(void *ptr)
{
unsigned int iter = ITER;
while (iter--) {
wait_event_from_device0();
pthread_mutex_lock(&thread_mutex);
g_status.context_delta++;
g_status.global_access_count++;
pthread_mutex_unlock(&thread_mutex);
}
return NULL;
}
void *context1(void *ptr)
{
unsigned int iter = ITER;
while (iter--) {
wait_event_from_device1();
pthread_mutex_lock(&thread_mutex);
g_status.context_delta--;
g_status.global_access_count++;
pthread_mutex_unlock(&thread_mutex);
}
return NULL;
}
int main(int argc, char **argv)
{
pthread_t tid0, tid1;
int iret;
if ((iret = pthread_create(&tid0, NULL, context0, NULL))) {
fprintf(stderr, "context0 creation error!\n");
return EXIT_FAILURE;
}
if ((iret = pthread_create(&tid1, NULL, context1, NULL))) {
fprintf(stderr, "context1 creation error!\n");
return EXIT_FAILURE;
}
pthread_join(tid0, NULL);
pthread_join(tid1, NULL);
printf("%d, %d\n", g_status.context_delta, g_status.global_access_count);
return 0;
}
Я планирую перенести этот код в ОС реального времени, который не поддерживает POSIX, и я хотел бы сделать эту операцию атомарной без использования семафоров или отключение/включение прерывания.
Как это сделать? Возможно ли это с помощью функции «атомного сравнения и замены» (CAS)?
Требуется ли в вашем коде частые обновления? Как бы вы поместили коэффициент чтения-обновления программы в реальную рабочую нагрузку? – darnir
@ darnir Я не мог задать вам вопрос. Не могли бы вы подробнее рассказать? А также у меня не было возможности измерить реальную рабочую нагрузку, потому что я не мог подключиться к реальному устройству. – albin
Как часто, по вашему мнению, вам потребуется обновить структуру? Вы будете опросить какой-то датчик и постоянно обновлять структуру? Или это очень редко, что вам нужно обновить структуру? – darnir