hur.cn - 华软网

 热门搜索

怎样处理变量的互斥问题,急!!!!!

  作者:未知    来源:网络    更新时间:2011/8/16
我有个程序运行较长的时间后出现了崩溃,找了很久发现有20个线程同一个函数同时读写一个变量,另外一个线程用一个函数也是读写一个变量,这里没有用到互斥,是不是不用互斥就会出现崩溃呢?需要怎样进行互斥?

20个线程做同样的一个函数
f(int x)
{
      a= a+x;

}

另外一个线程做一个函数
t(int y)
{

    a= a/8;
}

怎样用什么互斥的方法,能不能用InterlockedExchange进行互斥?如果不用互斥后果会程序崩溃吗?
---华软 网友回答---
创建
hMutex=CreateMutex(NULL,FALSE,NULL);

线程中等待
WaitForSingleObject(hMutex,INFINITE);

释放
ReleaseMutex(hMutex);
---华软网友回复---
对单个变量,不用那么复杂吧,好像可以用InterlockedExchange,我现在问的是如果没这个互斥,程序会崩溃吗?还有用InterlockedExchange是可以对变量进行多线程读写?
---华软网友回复---
不至于崩溃,只是你某些线程读写的是垃圾值
---华软网友回复---
用CriticalSection也可以
---华软网友回复---
引用 1 楼 hezhe1008 的回复:
创建
hMutex=CreateMutex(NULL,FALSE,NULL);

线程中等待
WaitForSingleObject(hMutex,INFINITE);

释放
ReleaseMutex(hMutex);

这个本来就是只对一个变量互斥
复杂吗?
但从你上边说的调用同一个函数来说,不会导致崩溃
---华软网友回复---
楼上的,不是调用同一函数,而是21个线程调用两个函数了
---华软网友回复---
函数指针?函数内部同时访问同一个变量了嘛

如果没有调用一个函数都不会有问题 
调用两个更不会有问题了
---华软网友回复---
到底这个会不会引起崩溃呢?有人测试过吗?
---华软网友回复---
不互斥不会引起程序的崩溃 只是线程调用的变量变得不可预测
比如你的f函数,假设a初始为0,传入的x为1,线程A调用了f函数,这时的a为0,然后做运算a+x,这时就有可能还没将结果1赋值给a 就有线程B也调用了f函数 这时的a仍然为0,然后线程A赋值结束,线程B计算赋值结束,那么这时a的值是???

你的f函数,a的值可能溢出(猜测这才是崩溃根源)
你的t函数,没有这个隐患


---华软网友回复---
引用 8 楼 zengting 的回复:
到底这个会不会引起崩溃呢?有人测试过吗?

老实说啊 你如果懂 说说也就算了,如果你不懂就应该多点耐心      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。