c – linux中共享内存中的多个链接列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – linux中共享内存中的多个链接列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2406字,纯文字阅读大概需要4分钟。
内容图文
![c – linux中共享内存中的多个链接列表](/upload/InfoBanner/zyjiaocheng/965/39ec08bb490b4eddbe4d2dbd081d0c64.jpg)
我使用C语言和Linux作为平台.
我想在多个进程中共享多个结构,这些结构具有链接列表的头部(这些列表也应该被共享)和指向彼此的指针.此数据所需的内存最高可达1Mb.
因为我不能在共享内存中使用指针,因为它们对于不同的进程无效.
有两种选择:
1)使用偏移值而不是指针.
2)否则,使用不同的共享内存并使用共享内存ID(由shmget返回)而不是指针.
由于要共享的内存大小很大,哪个选项更好?
你能建议另一种选择吗?
谢谢.
解决方法:
使用偏移值.
而不是指针,从共享内存区域的开头使用size_t偏移量(以字符为单位).在访问或操作这些列表的任何地方,您都需要这样做.
编辑添加:
使用偏移量可以在大多数体系结构上编译为非常高效的代码,并且可以使用__sync..()内置函数以原子方式访问和修改它们.请记住对所有访问使用内置函数,包括读取:否则,在非原子读取期间(或反之亦然),该值可能已被原子修改,从而导致数据损坏.
如果您知道共享内存的大小永远不会超过4GB,那么您可以使用uint32_t作为偏移类型,在64位体系结构上每个“指针”保存四个字节.如果将所有目标对齐到32位边界,则可以将其四倍化为8GB.
使用uint32_t的非常好的副作用是你可以在所有64位和一些32位架构上原子地操作指针对(两个连续的偏移).假设您还拥有共享内存中的所有内容也与32位边界对齐,并使用每个32位单元的偏移量,您可以使用原子方式获取/设置指针对
static inline void get_pair(void *const base, const uint32_t offset, uint32_t *const pair)
{
uint64_t *const ptr = (uint64_t *)(offset + (uint32_t *)base);
uint64_t val;
val = __sync_or_and_fetch(ptr, (uint64_t)0);
memcpy(pair, &val, sizeof val);
}
static inline void switch_pair(void *const base, const uint32_t offset, const uint32_t *const new, uint32_t *const old)
{
uint64_t *const ptr = (uint64_t *)(offset + (uint32_t *)base);
uint64_t oldval, newval;
memcpy(newval, &new, sizeof newval);
do {
/* Note: this access does not need to be atomic, */
memcpy(oldval, ptr, sizeof oldval);
/* because the next one verifies it. */
} while (!__sync_bool_compare_and_swap(ptr, oldval, newval));
if (old)
memcpy(old, &oldval, sizeof oldval);
}
__sync …()内置函数至少可以在GCC和Intel CC中使用.新的C11标准也采用了C 11-style __atomic..()内置版本,但在当前的编译器中实现这些功能还需要一些时间.
如果您编写库代码或您希望维护多年的代码,它可能会节省您查找两种内置类型的时间,并为您自己添加注释(或者在需要时为其自己添加注释在内置插件之间进行转换,以描述如果它们已经可用,您将使用哪个原子内置.
最后,请记住,使用这样的共享内存意味着您必须遵守同样的注意事项,就好像您有多个线程同时访问内存一样.原子操作会有所帮助,如果你可以原子地操作指针对,你可以用列表做一些非常聪明的技巧,但你仍然需要对角落情况和可能的竞争条件非常敏锐.
内容总结
以上是互联网集市为您收集整理的c – linux中共享内存中的多个链接列表全部内容,希望文章能够帮你解决c – linux中共享内存中的多个链接列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。