给shmat打两次电话
Call to shmat twice
我的程序有两个线程,我使用共享内存在两者之间进行通信。
每个线程都有一个"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)。
请参阅手册页
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 给shmat打两次电话