我有一个应用程序需要若干线程存在,因为须要进行大量数据处理工作,所以必须密集使用CPU资源。
在单CPU机器上运行,即使在每个线程的循环使用Sleep(0)来耗尽CPU资源(以达到对CPU资源的尽可能的利用),也不会出现任何问题,程序连续运行几个月没有问题。
但在双CPU机器上运行,上去就出错,跟踪出错的地方确实莫名其妙,比如程序崩在一个函数体中一个临时变量的析构上,这个临时变量根本不存在协调上的问题,等等。
好象网络上也没有多少关于多线程对双CPU的支持方面的文章可以借鉴,但是SQLSERVER好象可以指定CPU运行(在多CPU机器上),但不知道具体做法!
一直以来有一个不成熟的想法是,对CPU的控制总是操作系统的事情,跟程序员好象没有多大关系,管你多少个CPU,程序都是一样的写,现在看来这种认识好象是错误的!
期待有这方面编程经验的同仁能帮忙解决!
在单CPU机器上运行,即使在每个线程的循环使用Sleep(0)来耗尽CPU资源(以达到对CPU资源的尽可能的利用),也不会出现任何问题,程序连续运行几个月没有问题。
但在双CPU机器上运行,上去就出错,跟踪出错的地方确实莫名其妙,比如程序崩在一个函数体中一个临时变量的析构上,这个临时变量根本不存在协调上的问题,等等。
好象网络上也没有多少关于多线程对双CPU的支持方面的文章可以借鉴,但是SQLSERVER好象可以指定CPU运行(在多CPU机器上),但不知道具体做法!
一直以来有一个不成熟的想法是,对CPU的控制总是操作系统的事情,跟程序员好象没有多大关系,管你多少个CPU,程序都是一样的写,现在看来这种认识好象是错误的!
期待有这方面编程经验的同仁能帮忙解决!
fun()
{
CString csTemp ;
csTemp = "dddd" ;
}当函数退出栈的时候,调试器会跟踪出错的地方到
~CString(),具体应该是说这个地方的内存已经不可用了!
但这只是一个临时变量啊 不存在同步的问题啊!
苦恼啊!
这里需要说明的是,在我的这个程序逻辑上确实存在内存操作时候的同步问题,但该同步的地方都没有问题,在单CPU机器上都没有问题,如果有同步问题也会出错。基本上就是这两个地方了!
所以,使用线程局部变量TLS机制,保证不存在同步问题。
{
CPU1-> CString csTemp ;
CPU1-> csTemp = "dddd" ;
}
CPU2-> csTemp.~CString(); 有没有可能这样?
先在全局声明并初始化一个CriticalSection ll;
fun()
{
EnterCriticalSection(tt)
CString *csTemp = new CString("dddd");
delete csTempp;
LeaveCriticalSection(tt)
}
单CPU下,即使同步控制有一点缺陷,有时候也不会发生问题,多CPU下就比较容易出现问题了。
所以归根结底还是程序对多线程同步控制的问题。
SetThreadAffinityMask(HANDLE hThread, DWORD dwThreadAffinityMask);
我后来仔细想想,肯定还是程序本身的多线程同步出了问题!
我最后跟踪的结果是:如SnHnBn(大可达)说的,单CPU对于多线程同步问题好象不敏感,但一到多CPU下就立刻现形!当初苦恼万分的原因可能是:
本程序中绝大部分可能会引起访问冲突的成员都加锁了,有个别漏网之鱼被忽略了,但在单CPU下连续运行几个月都不出问题(如SnHnBn(大可达)所说:同步缺陷被掩盖了),更强化了自己已经对所有可能的地方都进行同步处理了的想法,所以就存在侥幸的想法,是不是别的地方有问题,其实不是,是我自己错了!
最后解决的办法是在该加锁的地方加锁,就OK了! 但是又有一个新的问题,好象运行效率并不如单CPU!不知各位有什么见解!我现在希望通过优化程序代码来解决!但出现这种现象的原因却是不明就里!