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