单进程单线程的程序,同时能占用1个CPU的1个核,那么单进程多线程的程序,同一时能占用1个CPU的多个核?
单进程的多线程是否能够实现跨cpu核心调度?如果能够,那么一个进程的多个线程访问同一个资源怎么样实现线程同步?是否要实现指令级别的同步?...
单进程的多线程是否能够实现跨cpu核心调度? 如果能够,那么一个进程的多个线程访问同一个资源怎么样实现线程同步? 是否要实现指令级别的同步?
展开
2个回答
展开全部
多线程程序可以同时占用多个核心;
调度CPU核心的任务会由操作系统来完成,程序员只须创建新线程即可;
多线程共享资源时可通过调用操作系统提供的线程同步API来实现线程同步;
windows的Interlocked函数族即为指令级别的同步API
调度CPU核心的任务会由操作系统来完成,程序员只须创建新线程即可;
多线程共享资源时可通过调用操作系统提供的线程同步API来实现线程同步;
windows的Interlocked函数族即为指令级别的同步API
追问
每个CPU核心上都并行的运行线程的指令,怎么提供指令级别的同步呢? 虽然有CAS提供指令级别的同步,但是我觉得这只适合单核cpu。多个cpu核心运行不同的线程,都对同一个变量进行操作,如:cpu1取值,然后改变,cpu2也取值,但是cpu1还没有更改该变量的值,cpu2读取旧值做运算更改,这样怎么同步呢?
追答
多核CPU会提供这样一类指令:当指令访问某一内存地址时,CPU会在总线上维持一个硬件信号,这个信号会阻止其他核心访问同一个内存地址。前面我提到的Interlocked函数族实际上就是运用这类指令实现的。
另外这只是实现线程同步的方法之中的一种,即用户级别的线程同步。这种方法不能将线程切换到等待状态。如果使用这种指令构造一个限制对共享资源访问的临界区,当一个线程试图访问某个已被占有的资源,它会不停地循环检测资源的占有状态,一直占据CPU时间,直到该资源被释放为止。
另外一种线程同步的实现方法时内核级线程同步:当一个线程试图访问共享资源时,会从用户模式切入到内核模式,然后由内核级的操作系统代码检查共享资源的占有状况,如果已被占有,会直接由系统的任务调度器把该线程切换到等待状态,也就是把线程调出CPU核心,什么时候共享资源被释放,什么时候把等待线程切换回准备状态,参加正常的CPU调度。这样就解决了用户级别线程同步的循环查询持续占据CPU时间的问题。
展开全部
可以实现线程与CPU的绑定,用于将线程均衡地分布在不同的CPU上运行,在Linux下可以实现,Windows的没有试过。
另外,线程间访问同一个资源需要使用临界区(CRITICAL_SECTION), 它是实现同一进程下不同线程间的对资源互斥访问的方法。主要函数有:InitializeCriticalSection, DeleteCriticalSection, EnterCriticalSection, LeaveCriticalSection. 可以查阅MSDN了解每个函数的详细用法。
另外,线程间访问同一个资源需要使用临界区(CRITICAL_SECTION), 它是实现同一进程下不同线程间的对资源互斥访问的方法。主要函数有:InitializeCriticalSection, DeleteCriticalSection, EnterCriticalSection, LeaveCriticalSection. 可以查阅MSDN了解每个函数的详细用法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询