【发布时间】:2014-04-01 21:36:43
【问题描述】:
我想知道如何做到这一点(使用 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
调用时的 lock 方法是这样的:
pthread_mutex_lock(&lock);
在将上述“Chunk”创建到共享内存缓冲区的开头时,它使用placement new,如下所示:
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
然后它通过扫描不同的块来尝试对共享内存进行操作,并在需要时尝试使用锁。
当我运行它时遇到奇怪的崩溃,其中块**是垃圾,我想知道 Lock 是否也可以跨进程工作,或者在上述简单步骤中我是否忽略了任何其他警告? SHARED pthread attr 是否足够,还是我需要使用完全不同的锁?
【问题讨论】:
-
"它尝试通过扫描不同的块来对共享内存进行操作,并且在需要时还尝试使用锁。"你需要展示你是如何使用锁的,因为你可能做错了。
-
我添加了有关锁定的详细信息
-
请注意,您不需要为每个锁创建单独的
pthread_mutexattr_t-- 您可以创建一个 attr(一次)并重用它来初始化每个锁。初始化后,锁不再引用 attr (所以你不需要保留它); attr 只是一种方便的方式,可以批量处理创建锁时读取的大量选项,而不是提供pthread_mutex_init几十个参数。
标签: c++ multithreading memory ipc shared-memory