毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

linux多线程全局变量如何保护

更新时间:2013-6-30:  来源:毕业论文

linux多线程全局变量如何保护

我的设备有很多全局变量作为设备参数,这些参数要求运行手动可以设置,通过网络可以设置,而且设备运行时候还要根据该参数决定运行状态;其中手动设置在一个线程,网络在一个线程,参数判断又在一个线程,请问我每一次访问(读或者写)都要用互斥锁保护吗?关键是我这类的参数很多,来回弄很麻烦,而且有时候由于程序结构的问题,不定在某一个地方就会引用或者修改这些全局变量,有时候难免会忘记保护;
大家有好点的办法吗?遇到这类情况如何处理?或者有什么替代方法

为什么一定要用全局变量呢,不能提供修改接口吗?接口中加锁、解锁

这个情况在单片机RTOS系统里经常遇到。我的做法是定义全局结构体,而结构体变量不要定义为全局,提供访问该变量的读写函数。该函数通过结构体成员的偏移量和字节数来访问变量成员,当然,该函数内进行锁定和解锁。
另外给你两个宏,你就有思路了。
// 计算结构类型中某一成员变量的偏移量。
#define OFFSET(t,m)     ((int)&(((t*)0)->m))
// 计算结构类型中某一成员变量的字节数。
#define SIZEOF(t,m)     (sizeof(((t*)0)->m))

全局变量在各线程里,安全起见都是要加锁的,楼主这种情况的话,可以考虑用读写锁

单纯的读可以不加锁,如果要进行“读+改写”,那就必须加锁,写个操作函数来完成“读+改写”的任务,在这个函数中必须加锁,没有捷径。

有1对线程,其中一个(线程1)负责视频采集(每秒25帧,由select负责管理读取数据),另外一个(线程2)负责处理报警信息,当确认报警信号时将另外一个线程采集的视频存储处理;要求在没有报警的时候采集视频线程不停的采集(不存储,在内存中实时更新),保证报警来时存储的视频是报警时刻视频;
问题来了:线程2接收到有效报警时如何告知线程1停止视频采集转而到存储处理呢?如果通过mutex加锁利用全局变量传递的话则线程1的while循环在select之前会不停的加锁解锁查看线程2处理的变量,这样效率是不是太低了?关键我的程序里有4对这样的线程,如果利用这种方法感觉不好,请问有什么好的方法吗?

当线程2进行图像处理时,线程1需要等待吗?如果需要等待线程2的结果,那么就需要加锁,使得内存中正在被检测的数据不被破坏。与图像处理过程相比,加锁解锁的代价可以或略不计。

这种情况和正常的,关键是看代码的架构规划了,不可避免的使用锁机制确实是很烦的。
把所有的交互以及逻辑和各种情况都罗列一下,然后看看有什么遗漏的。然后你的代码就按照你的罗列出来的情况去描述。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。