各位兄弟姐妹:一个Windows下的多线程程序在单核环境运行正常,在多核环境运行不稳定.
请高手帮忙解决一下,先谢了
(1) 多核环境下的多线程编程需要注意些什么?
(2) 有没有函数或者方法能够控制程序在固定的CPU核中运行?

解决方案 »

  1.   

    1.没什么要注意的,只是如果临界区没控制好的话更容易挂掉.(据说经典的双重检测锁在多核环境下有问题,据说而已,没验证出来-_-)
    2.试试SetProcessAffinityMask(   GetCurrentProcess(),   1   );
      

  2.   

    1.单核多线程,用不着自旋锁的循环计数。多核才有需要的。(但此问题不会造成很严重的不稳定,如果没用循环计数,顶多是在多核下线程切换更频繁些,不可能造成楼主的比单核不稳定的情况)
      多核下的多线程,可能涉及Cache miss增多的问题。可能是各个核使用的不是一个Cache,可能会因为Cache失效增多而造成性能下降。
    2.用SetThreadAffinityMask。线程亲缘性。
      

  3.   

    把程序里多线程访问的共享变量,都加上volatile吧,有可能是有些时候某线程直接从寄存器里取值了,而该变量的内存已经被其他线程改写了,就会出现不一致。
    当然,单核下也可能出现这个问题,但是多核下出错的可能性更大。
    多核下多线程之间互相打架的几率大了,所以有些单核下没有暴露出来的bug现形了。
      

  4.   

    根本差别在于:单处理器在同一时间只会有一个线程在运行;多处理器在同一时间可能会有多个线程在运行。举个例子说明一下常见的问题:当使用inc指令将一个变量加1时,处理器是把内存中的数读出、加1、再写回内存,在单处理器环境下,指令执行中途是不会发生线程切换的,所以该指令在多线程中是安全的;而在多处理器环境下,该指令执行到一半是,即数据读出但还没有写回内存时,另一个处理器上运行的线程可以对该内存地址中的数据进行修改,这样就可能产生问题,所以该指令在多处理器环境是不安全的,需要考虑线程同步。为解决这种问题,处理器提供了lock功能,使用该功能可以在指令未完成前阻止其它处理器访问内存,在VC中可以使用interlockedXxx这样的函数来实现此操作。另外多处理器是两个或两个以上线程同时,使线程冲突的可能性大大提高了,可能原本程序就存在问题,在单处理器环境不容易遇到因而没有发现,而在多处理下变成很容易发生。
    SetThreadAffinityMask可以让线程尽可能在某处理器上运行,但还是受系统调度的。
      

  5.   

    这个确实很有道理啊,INC指令在多核情况下不是原子操作了。这点向大牛学习了~但是,这里:
    您可能把Affinity和Ideal Processor记混了吧,这是我查MSDN上的:
    Thread Affinity:
    Thread affinity forces a thread to run on a specific subset of processors. // 注意"forces"
    Thread Ideal Processor:
    Use the SetThreadIdealProcessor function to specify a preferred processor for a thread. This does not guarantee that the ideal processor will be chosen, but provides a useful hint to the scheduler.
      

  6.   

    LZ说得对,刚又查了下MSDN,是我记错了。
      

  7.   

    LS说得对,刚又查了下MSDN,是我记错了。
      

  8.   

    interlockedXxx——这个回头试一下。