我有一个应用程序需要若干线程存在,因为须要进行大量数据处理工作,所以必须密集使用CPU资源。
  在单CPU机器上运行,即使在每个线程的循环使用Sleep(0)来耗尽CPU资源(以达到对CPU资源的尽可能的利用),也不会出现任何问题,程序连续运行几个月没有问题。
  但在双CPU机器上运行,上去就出错,跟踪出错的地方确实莫名其妙,比如程序崩在一个函数体中一个临时变量的析构上,这个临时变量根本不存在协调上的问题,等等。
   好象网络上也没有多少关于多线程对双CPU的支持方面的文章可以借鉴,但是SQLSERVER好象可以指定CPU运行(在多CPU机器上),但不知道具体做法!
   一直以来有一个不成熟的想法是,对CPU的控制总是操作系统的事情,跟程序员好象没有多大关系,管你多少个CPU,程序都是一样的写,现在看来这种认识好象是错误的!
   期待有这方面编程经验的同仁能帮忙解决!

解决方案 »

  1.   

    我也认为对cpu的操作是操作系统的事情,程序员根本不用去管。不过我们写多线程的程序,就必须认为我们的计算机是很多cpu的,而且很多处理可能都是同时进行的,所以这时候同步的作用就十分必要。只要我们的程序同步没有问题,那么运行在多cpu和单cpu应该是一样的。否则,windows的很多程序都应该有错误了。建议还是多在同步处理上找找原因。
      

  2.   

    cpu的运行和程序员基本上是没有多大的关系,不过呢???错误是莫名其妙的。我也在苦恼当中,希望你早日解脱。
      

  3.   

    在单CPU的时候,虽然线程会被随时切换到另一个线程,但是每时每刻,系统中还是只有一个线程在运行多CPU的时候,系统中可能会有多个线程在"真正的"同时运行,所以容易出现同步问题。
      

  4.   

    比如:
    fun()
    {
        CString csTemp  ;
        csTemp = "dddd" ;
    }当函数退出栈的时候,调试器会跟踪出错的地方到
    ~CString(),具体应该是说这个地方的内存已经不可用了!
    但这只是一个临时变量啊 不存在同步的问题啊!
    苦恼啊!
      

  5.   

    还有一个地方是memcpy()函数出错,调试器说无法定位到汇编代码!
    这里需要说明的是,在我的这个程序逻辑上确实存在内存操作时候的同步问题,但该同步的地方都没有问题,在单CPU机器上都没有问题,如果有同步问题也会出错。基本上就是这两个地方了!
      

  6.   

    并不是所有的MFC类都是多线程安全的,好像CString就是。
    所以,使用线程局部变量TLS机制,保证不存在同步问题。
      

  7.   

    CPU1->fun()
    {
    CPU1->    CString csTemp  ;
    CPU1->    csTemp = "dddd" ;
    }
    CPU2->    csTemp.~CString(); 有没有可能这样?
      

  8.   

    不知道应用层里有没有像驱动里的spinlock这种自旋锁。
      

  9.   

    试试下面的:
    先在全局声明并初始化一个CriticalSection ll;
    fun()
    {
    EnterCriticalSection(tt)
    CString *csTemp = new CString("dddd");
    delete csTempp;
    LeaveCriticalSection(tt)
    }
      

  10.   

    应该不是CPU的问题,而是你的程序对多线程的同步控制的问题。
    单CPU下,即使同步控制有一点缺陷,有时候也不会发生问题,多CPU下就比较容易出现问题了。
    所以归根结底还是程序对多线程同步控制的问题。
      

  11.   

    如果每个线程的计算量很大的话,对单CPU来说多线程并不会比单线程有多少优势。我也做过多线程多CPU的情况,因为计算量很大,所以我的做法是有几个CPU开几个线程,并没有出现版主所说的情况,我想你的情况还是同步出了问题。你不凡根据CPU的个数来开辟线程的个数,然后把线程绑定到某个CPU上,试试情况怎么样。以下是CPU和线程绑定的函数,你可以参考:SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor);
    SetThreadAffinityMask(HANDLE hThread, DWORD dwThreadAffinityMask);
      

  12.   

    感谢各位的解答!问题已经解决!
    我后来仔细想想,肯定还是程序本身的多线程同步出了问题!
    我最后跟踪的结果是:如SnHnBn(大可达)说的,单CPU对于多线程同步问题好象不敏感,但一到多CPU下就立刻现形!当初苦恼万分的原因可能是:
       本程序中绝大部分可能会引起访问冲突的成员都加锁了,有个别漏网之鱼被忽略了,但在单CPU下连续运行几个月都不出问题(如SnHnBn(大可达)所说:同步缺陷被掩盖了),更强化了自己已经对所有可能的地方都进行同步处理了的想法,所以就存在侥幸的想法,是不是别的地方有问题,其实不是,是我自己错了!
       最后解决的办法是在该加锁的地方加锁,就OK了!  但是又有一个新的问题,好象运行效率并不如单CPU!不知各位有什么见解!我现在希望通过优化程序代码来解决!但出现这种现象的原因却是不明就里!