给shmat打两次电话

Call to shmat twice

本文关键字:两次 电话 shmat      更新时间:2023-10-16

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

每个线程都有一个"init"方法。在init方法中,我调用"shmget"answers"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中的"data"无法访问或出现某种故障。事实是,在线程1中,我可以访问整个共享段,但在线程2中,我只能访问前16个字节,所以我不知道发生了什么。

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

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

我怀疑在给定的例子中,您不能确定Thread1::init()是在Thread2::init(。

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

请参阅手册页