Я отправил похожий вопрос несколько дней назад, но так и не получил ответа.У меня проблема в том, что я работаю над переносом кода Windows в реальном времени (RTX) в Linux, и он использует именованные мьютексы в качестве метода синхронизации очередей данных.Проблема в том, что я знаю, что мьютексы в Linux могут быть установлены в общей памяти, и это нормально, проблема в том, что мой администратор очередей никогда не знает, сколько мьютексов ему потребуется, он ничего не знает об этом, пока кто-товызывает его, чтобы создать новую очередь со связанным мьютексом.Windows управляет этим с помощью именованных мьютексов, поэтому, когда кто-то пытается создать или открыть существующую очередь, он может взять связанный мьютекс по имени, и я не нашел правильного способа сделать это в Linux.Я не могу опубликовать фактический код здесь, но вот некоторые ключевые фрагменты:
typedef struct Node{
void *qid;
void shmOnj;
char qname[80]
char semname[80]
sem_t *semid
struct Node *next
struct Node *prev
}
struct GnrlQ {
pthread_mutex_t *qMutexid
sem_t *qSemid
int msize
int depth
int nexton
int nextoff
char msgarray[]
}
код использует вышеупомянутые структуры для установкисвязанный список (узлы) и очередь, код создает общее пространство памяти, когда кто-то создает очередь, и преобразует его в структуру очереди.
Проблема возникает, когда другой вызывающий пытается открыть и использовать существующийВ очереди он может получить ту же область совместно используемой памяти, используя mmap с именованной областью, и устанавливает ее в новом узле с указателями на именованный адрес, а также устанавливает другие свойства, включая семафор и мьютекс.Проблема заключается в попытке получить мьютекс.
Обходной путь, о котором я думал, кажется очень грязным, где я храню 2 массива, один из которых содержит имя очереди, которая используется для «поиска» индекса индекса.другой массив, содержащий указатели на связанные мьютексы, должен быть лучше.