Я хочу проверить правильность моего понимания. Подобная вещь сложна, поэтому я почти уверен, что чего-то не хватает. У меня есть программа, состоящая из потока в реальном времени и потока в реальном времени. Я хочу, чтобы поток non-RT мог поменять указатель на память, используемую потоком RT.
Из документов я понимаю, что это можно сделать в g++
с помощью:
// global
Data *rt_data;
Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
// Atomic pointer swap.
Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
// Non-atomic, cross your fingers.
Data *old_d = rt_data;
rt_data = new_data;
#endif
return old_d;
}
Это единственное место в программе (кроме начальной настройки), где rt_data
изменено. Когда rt_data
используется в контексте реального времени, он копируется на локальный указатель. Для old_d
, позже, когда он уверен, что старая память не используется, она будет освобождена в потоке, отличном от RT. Это верно? Нужно ли мне volatile
где угодно? Есть ли другие примитивы синхронизации, которые я должен вызывать?
Кстати, я делаю это на С++, хотя меня интересует, отличается ли ответ на C.
Спасибо заранее.