请教关于多线程对双CPU的支持问题!(分不够可另开!!!)

guoxm 2004-04-20 11:45:35
我有一个应用程序需要若干线程存在,因为须要进行大量数据处理工作,所以必须密集使用CPU资源。
在单CPU机器上运行,即使在每个线程的循环使用Sleep(0)来耗尽CPU资源(以达到对CPU资源的尽可能的利用),也不会出现任何问题,程序连续运行几个月没有问题。
但在双CPU机器上运行,上去就出错,跟踪出错的地方确实莫名其妙,比如程序崩在一个函数体中一个临时变量的析构上,这个临时变量根本不存在协调上的问题,等等。
好象网络上也没有多少关于多线程对双CPU的支持方面的文章可以借鉴,但是SQLSERVER好象可以指定CPU运行(在多CPU机器上),但不知道具体做法!
一直以来有一个不成熟的想法是,对CPU的控制总是操作系统的事情,跟程序员好象没有多大关系,管你多少个CPU,程序都是一样的写,现在看来这种认识好象是错误的!
期待有这方面编程经验的同仁能帮忙解决!
...全文
134 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoxm 2004-04-27
  • 打赏
  • 举报
回复
感谢各位的解答!问题已经解决!
我后来仔细想想,肯定还是程序本身的多线程同步出了问题!
我最后跟踪的结果是:如SnHnBn(大可达)说的,单CPU对于多线程同步问题好象不敏感,但一到多CPU下就立刻现形!当初苦恼万分的原因可能是:
本程序中绝大部分可能会引起访问冲突的成员都加锁了,有个别漏网之鱼被忽略了,但在单CPU下连续运行几个月都不出问题(如SnHnBn(大可达)所说:同步缺陷被掩盖了),更强化了自己已经对所有可能的地方都进行同步处理了的想法,所以就存在侥幸的想法,是不是别的地方有问题,其实不是,是我自己错了!
最后解决的办法是在该加锁的地方加锁,就OK了!

但是又有一个新的问题,好象运行效率并不如单CPU!不知各位有什么见解!我现在希望通过优化程序代码来解决!但出现这种现象的原因却是不明就里!
Quinn 2004-04-26
  • 打赏
  • 举报
回复
如果每个线程的计算量很大的话,对单CPU来说多线程并不会比单线程有多少优势。

我也做过多线程多CPU的情况,因为计算量很大,所以我的做法是有几个CPU开几个线程,并没有出现版主所说的情况,我想你的情况还是同步出了问题。

你不凡根据CPU的个数来开辟线程的个数,然后把线程绑定到某个CPU上,试试情况怎么样。

以下是CPU和线程绑定的函数,你可以参考:

SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor);
SetThreadAffinityMask(HANDLE hThread, DWORD dwThreadAffinityMask);
DoubleJiang 2004-04-24
  • 打赏
  • 举报
回复
dwProcessId
114sky 2004-04-24
  • 打赏
  • 举报
回复
我猜测应该是同步的问题?
msdn_user 2004-04-22
  • 打赏
  • 举报
回复
期待答案
PiggyXP 2004-04-21
  • 打赏
  • 举报
回复
学习,友情up
SnHnBn 2004-04-21
  • 打赏
  • 举报
回复
应该不是CPU的问题,而是你的程序对多线程的同步控制的问题。
单CPU下,即使同步控制有一点缺陷,有时候也不会发生问题,多CPU下就比较容易出现问题了。
所以归根结底还是程序对多线程同步控制的问题。
rwdx 2004-04-21
  • 打赏
  • 举报
回复
试试下面的:
先在全局声明并初始化一个CriticalSection ll;
fun()
{
EnterCriticalSection(tt)
CString *csTemp = new CString("dddd");
delete csTempp;
LeaveCriticalSection(tt)
}
自由的风 2004-04-21
  • 打赏
  • 举报
回复
不知道应用层里有没有像驱动里的spinlock这种自旋锁。
rwdx 2004-04-21
  • 打赏
  • 举报
回复
CPU1->fun()
{
CPU1-> CString csTemp ;
CPU1-> csTemp = "dddd" ;
}
CPU2-> csTemp.~CString(); 有没有可能这样?
sixibb 2004-04-21
  • 打赏
  • 举报
回复
晕了,这个问题好象在网络游戏中会出现很大的痛苦哦
ahao 2004-04-21
  • 打赏
  • 举报
回复
gz
guoxm 2004-04-20
  • 打赏
  • 举报
回复
比如:
fun()
{
CString csTemp ;
csTemp = "dddd" ;
}

当函数退出栈的时候,调试器会跟踪出错的地方到
~CString(),具体应该是说这个地方的内存已经不可用了!
但这只是一个临时变量啊 不存在同步的问题啊!
苦恼啊!
xstring 2004-04-20
  • 打赏
  • 举报
回复
崩在一个函数体中一个临时变量的析构上
-----------------------------------

具体是什么错误?
zhangcrony 2004-04-20
  • 打赏
  • 举报
回复
前不久有人问过类似的问题,没找到满意的答案。
ddddh 2004-04-20
  • 打赏
  • 举报
回复
在单CPU的时候,虽然线程会被随时切换到另一个线程,但是每时每刻,系统中还是只有一个线程在运行

多CPU的时候,系统中可能会有多个线程在"真正的"同时运行,所以容易出现同步问题。
jnlon 2004-04-20
  • 打赏
  • 举报
回复
cpu的运行和程序员基本上是没有多大的关系,不过呢???

错误是莫名其妙的。我也在苦恼当中,希望你早日解脱。
jemmylau 2004-04-20
  • 打赏
  • 举报
回复
我也认为对cpu的操作是操作系统的事情,程序员根本不用去管。

不过我们写多线程的程序,就必须认为我们的计算机是很多cpu的,而且很多处理可能都是同时进行的,所以这时候同步的作用就十分必要。

只要我们的程序同步没有问题,那么运行在多cpu和单cpu应该是一样的。否则,windows的很多程序都应该有错误了。

建议还是多在同步处理上找找原因。
菜牛 2004-04-20
  • 打赏
  • 举报
回复
并不是所有的MFC类都是多线程安全的,好像CString就是。
所以,使用线程局部变量TLS机制,保证不存在同步问题。
guoxm 2004-04-20
  • 打赏
  • 举报
回复
还有一个地方是memcpy()函数出错,调试器说无法定位到汇编代码!
这里需要说明的是,在我的这个程序逻辑上确实存在内存操作时候的同步问题,但该同步的地方都没有问题,在单CPU机器上都没有问题,如果有同步问题也会出错。

基本上就是这两个地方了!
加载更多回复(1)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧