gpt4 book ai didi

c++ - 调用 shmat 两次

转载 作者:太空狗 更新时间:2023-10-29 12:20:09 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

参见 manpage

关于c++ - 调用 shmat 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12154533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com