我想知道如何做到这一点(使用C++ 98)。这里是我的场景:我有进程A和进程B.进程A在共享内存中分配一个大缓冲区,并将其分成固定数量的块。然后,它使用了一系列这样的结构来表示每个组块:如何在共享内存的同一区域上工作的两个进程之间共享锁定?
struct Chunk
{
Lock lock; //wrapper for pthread_attr_t and pthread_mutex_t
char* offset; //address of the beginning of this chunk in the shared memory buffer
};
的锁定构造时执行此:
pthread_mutexattr_init(&attrs);
pthread_mutexattr_setpshared(&attrs, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&lock,&attrs); //lock is pthread_mutex_t and attrs is pthread_mutexattr_t
称为当锁定方法做到这一点:
pthread_mutex_lock(&lock);
当创建上述“块”到像这样的共享内存缓冲区的开始时,它使用放置新:
char* mem; //pointer to the shared memory
Chunks[i] = new (mem) Chunk; //for i = {1..num chunks}
mem += sizeof(Chunk);
然后它分配偏移并继续写入缓冲区的剩余部分。每次在与上述其中一个对应的块中写入时,它会抓取块锁并在完成时释放它。
现在进程B出现,并且在同一共享存储器缓冲区映射到存储器和试图检索这样的数据块:
Chunk** chunks = reinterpret_cast<Chunk**)(mem); //mem being the pointer into the shared memory
然后它试图通过扫描周围的不同的块上的共享存储器操作和如果需要也试图使用锁。
我遇到奇怪的崩溃时,我运行这个块**是垃圾,我想知道如果锁将工作跨过程,以及如果有任何其他的警告我忽略在上面的简单步骤?有足够的SHARED pthread属性,还是需要使用完全不同的锁品种?
“它试图通过扫描不同的块来操作共享内存,并在需要时尝试使用锁。”你需要展示你如何使用锁,因为你可能做错了。 – msw
我在锁上增加了细节 –
请注意,您不需要为每个锁创建单独的'pthread_mutexattr_t' - 您可以创建一个attr(一次)并重新使用它来初始化每个锁。初始化之后,锁不会引用attr(所以你不需要保留它); attr只是一个方便的方法,用于批量创建锁时读取的很多选项,而不是提供'pthread_mutex_init'几十个参数。 –