线程操作共享变量的一点分享。

本文介绍了一种解决多线程环境下消息处理时出现的程序异常退出问题的方法。通过使用Win32提供的CriticalSection实现线程同步,确保了对共享资源的安全访问,成功避免了程序异常退出,并实现了稳定处理大量消息的目标。

前段时间为了解决Volte的T侧短消息流程问题,自己写了一个T侧短消息的工具,在基础线程上搞了3个线程。因为公司的执行机都是4核以上的虚拟机,所以线程数量上完全没问题。

程序启动时创建的线程用来做维护了,比如接收了多少消息,发送了多少消息,都有什么类型的消息。

线程1用来接收消息,收了消息啥也不干,直接转成字符串就扔到收消息队列里面了。

线程2用来处理消息,主要是区分消息类型,然后将需要返回的消息生成,再扔到发消息队列里面。

线程3就是用来发消息的,消息队列里面有什么就发生么。

 

三个线程之间存在共享数据交互,主要体现在消息队列的处理上。消息队列在处理的时候没有采用什么特殊的保护机制,目前看Vector到是能正常处理的。但是偶尔会出现程序异常退出的情况。程序架构比较简单,应该不会出什么问题。处理了上亿的消息也没见到什么异常。

所以针对程序异常退出的问题,现在怀疑点就是vector的线程安全了。

针对这个问题,看了下核心编程,想到了一种手工锁,简单讲就是利用volatile变量的内存实时特点,手工加个锁。申请锁的时候判断下是否为true,为true就进入循环锁,不为true了就退出来。

通过这种方式完成变量的一个简单锁定,如果数据正在被处理,那么就等一会。

但是针对这种方式,比较担心万一不是原子命令,比如讲一个volatile变量设置为1需要执行3个汇编指令,多核处理器下可能会有极小概率的打架事件,都给锁住了。

 

2017-06-04

程序异常退出的问题已经通过win32提供的临界区CriticalSection搞定了,对不用变量声明不同的临界区,对同一个变量进行操作的时候,就进入一下临界区,搞完了退出来。

程序再也没异常退出过,十几亿处理量,跑好几天都没事。

 

转载于:https://www.cnblogs.com/matrix-r/p/6666385.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值