我有个全局变量a,只会在一个线程thread1中会进行a赋值操作,其他thread2线程只会进行a读取操作,程序如下:
char g_cA;void thread1(void)
{
while(1)
{
g_cA = 'a';
SetEvent(hEvent2);
dwReturnSingle = WaitForSingleObject(hEvent1, 200);
switch(dwReturnSingle)
{
case WAIT_OBJECT_0:
{ ...}
break;
default:
break;
}
g_cA ++; //这里原本应该是'a' ++,可是有时候会是其他字符++;
{...}
}
}void thread2(void)
{
int iTmp;
while(1)
{
dwReturnSingle = WaitForSingleObject(hEvent2,INFINITE);
if (dwReturnSingle == WAIT_OBJECT_0)
{
iTmp = g_cA;
{...}
}
SetEvent(hEvent1);
}
}
现在问题是:
偶尔会出现在线程thread2读值操作以后setevent,thread1中waitforsingleobject()同步以后,这个a值偶尔会发生改变。真不知道怎么会变,因为a的赋值在thread1中。
如上面程序,开始在Thread1中g_cA = 'a'; 在Thread2中把这个值传给iTmp;在返回到Thread1后,有时候会变。。
请大家帮帮想想,谢谢了
char g_cA;void thread1(void)
{
while(1)
{
g_cA = 'a';
SetEvent(hEvent2);
dwReturnSingle = WaitForSingleObject(hEvent1, 200);
switch(dwReturnSingle)
{
case WAIT_OBJECT_0:
{ ...}
break;
default:
break;
}
g_cA ++; //这里原本应该是'a' ++,可是有时候会是其他字符++;
{...}
}
}void thread2(void)
{
int iTmp;
while(1)
{
dwReturnSingle = WaitForSingleObject(hEvent2,INFINITE);
if (dwReturnSingle == WAIT_OBJECT_0)
{
iTmp = g_cA;
{...}
}
SetEvent(hEvent1);
}
}
现在问题是:
偶尔会出现在线程thread2读值操作以后setevent,thread1中waitforsingleobject()同步以后,这个a值偶尔会发生改变。真不知道怎么会变,因为a的赋值在thread1中。
如上面程序,开始在Thread1中g_cA = 'a'; 在Thread2中把这个值传给iTmp;在返回到Thread1后,有时候会变。。
请大家帮帮想想,谢谢了
解决方案 »
- 6个数如何分成3组,而且每次没有两个是两同的。求算法
- vs2008用哪个xml解析器比较好阿
- 菜鸟程序员询问关于编程进行磁盘操作的问题
- 请教:CMarkup解析xml文件?
- dll参数问题
- 请教一下:串行化数据里的.IsStoring,.IsLoading与freed,fwrite的区别!
- 复合文档打不开,帮忙看看!
- CListCtrl类中如何确定所选item问题。
- 关于邮件格式的解码Content-Transfer-Encoding: base64
- Tuxedo安装后进入,应该怎么填写IIOP Listener?
- 各位高手``小弟遇到个问题``虽然很幼稚``但是看在小弟是初学者``请各位高手帮帮忙``
- 编辑框的UNDO
都没讲清楚是什么属性的?还有这2个线程会一直执行下去?什么时候停?
两个线程不会停的,thread1是发送线程,thread2是接收线程。to BoXoft :volatile 关键字表示这个变量不知道什么时候会被动被改变,因此告诉编译器不要优化它,不要读现有寄存器中的它,而每次去重新读它的地址的值。但是我的这个变量不要求它这样,反而是相反的功能,我的g_cA是只会在thread1赋值,其他线程都是读取而已。我真的搞不明白什么原因了,请大家帮帮忙吧。
用volatile在加InterlockedExchange(赋值)或InterlockedIncrement(++操作)就行啦。
另外,你的thread1并不是单单对a赋值,g_cA++是包含读写操作的。
你的等待时间太短了,200ms,来个Infinite试试
另外,如果你这样写WaitForSingleObject(hEvent1, 200);
event2可能会被set多次的,这是不好的编程手法
WaitForSingleObject(hEvent1, 200);
你的等待时间太短了,200ms,来个Infinite试试这样不行,因为我thread1不能一直等待,基本在一段时间后我是要返回的,因为thread2是查询数据。另外,如果你这样写WaitForSingleObject(hEvent1, 200);
event2可能会被set多次的,这是不好的编程手法没有明白你的意思,event2可能被set什么多次?setevent???什么情况下setevent2会多次?请教了
{
while(1)
{
InterlockedExchange((LONG *)&g_cA,'a');
// g_cA = 'a';
// g_cA ++; //这里原本应该是'a' ++,可是有时候会是其他字符++;
InterlockedIncrement((LONG *)&g_cA);
}
}void thread2(void)
{
int iTmp;
while(1)
{
iTmp = g_cA;
}
}还是
thread2只想得到g_cA自加后的值?
thread1是一个循环g_cA ++,
thread2是根据g_cA 来循环做一些事情。
也就是说thread1中的g_cA 要影响到thread2中的执行流程
???不懂
如果是循环g_cA++,为什么你的while循环的第一句就是一个g_cA的赋值语句?
如果是这样,g_cA的值只有2个可能:'a'或'b'
while(1)
{
g_cA = 'a';
...
}
sorry,我没有把程序些完,的确只是写了一个大概意思,g_cA这个变量是a到g的数,就是a到g之间不停循环
我在重新说一下
两个event hEvent1 hEvent2都是自动型的。
g_cA = 'a';
void thread1(void)
{
while(1)
{ switch (g_cA)
{
case 'a';
do some...
break;
case 'b';
do some...
break;
case 'c';
do some...
break;
default:
g_cA = 'a';
contiune;
}
senddata();
WaitForSingleObject(hEvent1,INIFINTE);
{do some... } g_cA ++; //如果之前是’a‘,在++之前,WaitForSingleObject返回之后,应该还是’a‘,可是现在它可能边为’c‘,或’b‘,不知道哪里出问题了
}
}void thread2(void)
{
int iTmp;
while(1)
{
WaitForSingleObject(hEvent2,INIFINTE);
recvdata()
switch (g_cA)
{
case 'a';
do some...
break;
case 'b';
do some...
break;
case 'c';
do some...
break;
default:
break;
}
SetEvent(hEvent1); }
}谢谢了
在thread1里面,senddata以后,WaitForSingleObject之前,有一句SetEvent(hEvent2)
{
while(1)
{
g_cA = 'a';
SetEvent(hEvent2);
dwReturnSingle = WaitForSingleObject(hEvent1, 200);
switch(dwReturnSingle)
{
case WAIT_OBJECT_0:
{ ...
//////////////////你的本意是通过thread2的SetEvent(hEvent1);来改变g_cA?
g_cA ++; //这样?
}
break;
default:
break;
}
{...}
}
}
WaitForSingleObject(hEvent1, 200);
现在又是
WaitForSingleObject(hEvent1,INIFINTE);
究竟是怎么样的啊?
sorry,的确是WaitForSingleObject(hEvent1,200);to regnig(fivefouroseven)
不是你说的意思,g_cA++是在 switch(dwReturnSingle)之后的外面语句中。是自身++。先谢谢各位了,问题至少现在看来是解决(长时间考机验证,原来基本几分钟就会出现的错误)
是线程的优先级问题,把thread1的优先级设置高与thread2就ok。