打电话给shmat两次

时间:2012-08-28 07:18:51

标签: c++ linux multithreading thread-safety shared-memory

我的程序有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'两次以使共享内存可以从不同的指针访问?

1 个答案:

答案 0 :(得分:2)

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

我怀疑在给定的例子中你不能确定在Thread2 :: init()之前调用Thread1 :: init()所以在Thread2中你访问的不是创建的内存 - 所以这就是观察到问题的原因。

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

请参阅manpage