几天前,我发布了一个类似的问题,但并未真正得到答案。我遇到的问题是我正在将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个数组,其中一个包含队列的名称,该数组用于“查找”另一个数组的索引,该数组包含指向相关互斥对象的指针,更好的方法。