我的程序有2个线程,我使用共享内存在两者之间进行通信。
每个线程都有一个'init'方法。 在init方法中,我调用'shmget'和'shmat'来获取共享内存段并附加到局部variables。 一部分代码如下所示:
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个字节,所以我不知道发生了什么。
这是否意味着每个共享内存段可以一次连接到一个位置? 可以两次调用'shmat'来使共享内存可以从不同的指针访问吗?
每个共享内存段可以一次连接到多个位置。 可以调用'shmat'两次以使共享内存可以从不同的指针访问。
我怀疑在给定的例子中,你不能确定Thread1 :: init()在Thread2 :: init()之前被调用,所以在Thread2中你正在访问未创建的内存 – 所以这是观察到的问题的原因。
这两个调用都使用IPC_CREAT(当然没有IPC_EXCL)。
参见manpage