首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

2013-07-08 
linux多线程全局变量的保护问题如题,我的设备有很多全局变量作为设备参数,这些参数要求运行手动可以设置,

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

热点排行