欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

linux多线程全局变量的保护有关问题

更新时间: 2014-01-05 03:19:34 责任编辑: Author_N1

 

linux多线程全局变量的保护问题
如题,我的设备有很多全局变量作为设备参数,这些参数要求运行手动可以设置,通过网络可以设置,而且设备运行时候还要根据该参数决定运行状态;其中手动设置在一个线程,网络在一个线程,参数判断又在一个线程,请问我每一次访问(读或者写)都要用互斥锁保护吗?关键是我这类的参数很多,来回弄很麻烦,而且有时候由于程序结构的问题,不定在某一个地方就会引用或者修改这些全局变量,有时候难免会忘记保护;
大家有好点的办法吗?遇到这类情况如何处理?或者有什么替代方法
--参考方法--
为什么一定要用全局变量呢,不能提供修改接口吗?接口中加锁、解锁
--参考方法--
这个情况在单片机RTOS系统里经常遇到。我的做法是定义全局结构体,而结构体变量不要定义为全局,提供访问该变量的读写函数。该函数通过结构体成员的偏移量和字节数来访问变量成员,当然,该函数内进行锁定和解锁。
另外给你两个宏,你就有思路了。
// 计算结构类型中某一成员变量的偏移量。
#define OFFSET(t,m)     ((int)&(((t*)0)->m))
// 计算结构类型中某一成员变量的字节数。
#define SIZEOF(t,m)     (sizeof(((t*)0)->m))
--参考方法--
全局变量在各线程里,安全起见都是要加锁的,楼主这种情况的话,可以考虑用读写锁
--参考方法--
单纯的读可以不加锁,如果要进行“读+改写”,那就必须加锁,写个操作函数来完成“读+改写”的任务,在这个函数中必须加锁,没有捷径。
--参考方法--
是的,有竞态就要互斥。有互斥就要注意线程安全
--参考方法--
当线程2进行图像处理时,线程1需要等待吗?如果需要等待线程2的结果,那么就需要加锁,使得内存中正在被检测的数据不被破坏。与图像处理过程相比,加锁解锁的代价可以或略不计。
--参考方法--
这种情况和正常的,关键是看代码的架构规划了,不可避免的使用锁机制确实是很烦的。
把所有的交互以及逻辑和各种情况都罗列一下,然后看看有什么遗漏的。然后你的代码就按照你的罗列出来的情况去描述。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:19:34
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20820/
本文WWW.DOC100.NET DOC100.NET版权所有。