2

我的程序有 2 个线程,我使用共享内存在两者之间进行通信。

每个线程都有一个“init”方法。在 init 方法中,我调用 'shmget' 和 'shmat' 来获取共享内存段并附加到局部变量。部分代码如下:

Thread 1 (which runs first):

void init() {
  this->segment_id = shmget(SAME_KEY,SAME_SIZE,IPC_CREAT|S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH);
  this->data       = shmat(this->segment_id,0,0);
}

Thread 2 (which runs after thread 1):

void init() {
  this->segment_id = shmget(SAME_KEY,SAME_SIZE,0);
  this->data       = shmat(this->segment_id,0,0);
}

该程序正在运行,但它给出了意想不到的结果。我担心的是,在第二个线程中调用“shmat”可能会使线程 1 中的“数据”无法访问或出现某种故障。事实是,在线程 1 中我可以访问整个共享段,但在线程 2 中我只能访问前 16 个字节,所以我不知道发生了什么。

这是否意味着每个共享内存段一次可以附加到 1 个位置?可以两次调用“shmat”以使共享内存可以从不同的指针访问吗?

4

1 回答 1

2

每个共享内存段可以一次附加到多个位置。可以调用 'shmat' 两次以使共享内存可以从不同的指针访问。

我怀疑在给定的示例中,您不能确定 Thread1::init() 在 Thread2::init() 之前被调用,因此在 Thread2 中您访问的是未创建的内存 - 这就是观察到问题的原因。

对两个调用都使用 IPC_CREAT(当然没有 IPC_EXCL)。

参见手册页

于 2012-08-28T08:02:53.647 回答