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

一个cpp中调用另一个cpp线程中的变量,有时候出现读不到的有关问题

2013-12-13 
一个cpp中调用另一个cpp线程中的变量,有时候出现读不到的问题在serial.CPP中定义了一个全局变量volatile u

一个cpp中调用另一个cpp线程中的变量,有时候出现读不到的问题
在serial.CPP中定义了一个全局变量volatile unsigned char g_bNewMsg;
int Exec_Ticket_InSystem()
{调用g_bNewMsg}
在主对话框cpp中有一个线程读串口数据并给g_bNewMsg赋值,有时候serial.CPP中调用g_bNewMsg失败,好像g_bNewMsg没有来得及赋值,我在线程读串口之前加了sleep(1)好多了,但几十次中还偶尔出现读不到g_bNewMsg的值怎么回事?
[解决办法]

引用:
Quote: 引用:

全局变量g_bNewMsg如果被两个线程有写操作的必须进行排他。

那为什么在读串口之前加了一个sleep(1),就好点呢?另外我把读串口超时设的比较小也能起点作用,没设超时之前几乎都不能读到变量的值的
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=100;
TimeOuts.ReadTotalTimeoutConstant=100;

sleep加入后,有可能变量g_bNewMsg有值,有可能还没有值,这种随机性太强了。
最好去做个同步,既能保证数据的完整性,也能保证数据正确。
[解决办法]
引用:
Quote: 引用:

数据同步有问题,比如,你线程A正在写变量的时候,你就去读变量,必须加人同步机制

是这样的吗?我听我一个比较牛的同事他说一个负责写一个负责读没事啊,不要做同步的?如果做同步咋做呢?像我这样的情况


同步主要就是要解决读写、写写碰撞的控制!就你描述而言,不加入sleep,碰撞的几率就很大,加人sleep(1)情况就好很多,那么如果你加入sleep(10),sleep(100)那情况肯定就好更多,但是仍然有碰撞的可能!
[解决办法]
waitforsingleobject ....
[解决办法]
读不到数据是什么意思?

读错了?数据沒更新?

你这个是unsigned char类型的,读写都是原子操作,应该不需要加锁。

热点排行