我有一段代码处理多线程(有共享资源)问题,如:
CRITICAL_SECTION gCS;
InitializeCriticalSection(&gCS);
EnterCriticalSection(&gCS);
// Do some shared resources stuff
LeaveCriticalSection(&gCS);
在this MSDN page中写道:“单个进程的线程 [我的粗体]可以使用关键部分对象进行互斥同步。”
所以,我的问题是:操作系统决定将线程分成不同的进程,甚至是不同的处理器。
EnterCriticalSection
确实不能胜任这项工作吗?如果答案是“关键部分对多处理没有帮助”,那么替代方案是什么?
我不想使用Boost类。
答案 0 :(得分:4)
操作系统不会将线程划分为不同的进程。
EnterCriticalSection
适用于具有多个线程的程序,以及具有多个处理器的系统。
答案 1 :(得分:4)
所以,我的问题是操作系统的情况如何 决定将theards划分为不同的过程,甚至不同 处理器。
不同的处理器 - 关键部分涵盖了这一点。
不同的流程 - 您需要不同的synchronization API,它们可以在流程之间共享[kernel]对象,例如mutexes和semaphores。
请参阅Using Mutex Objects部分中的示例用法。
答案 2 :(得分:2)
如果所有线程都在同一个程序中启动,那么它们就是单个进程的一部分,并且没有任何人(包括操作系统)能够“分离它们”。它们仅作为该过程的一部分存在,并将随着该过程而死亡。使用关键部分非常安全。
答案 3 :(得分:-1)
为进程分配了一个新的地址空间(堆栈和堆),而在创建一个线程时,它会隐式分配启动器进程的内存空间,但是为新分配的自有堆栈空间(一个新的堆栈空间)被分配给每个不同的线程)
对于操作系统,线程执行的过程与进程相同,当然使用线程时,这可能会导致更多缓存和内存\页面命中。
操作系统执行程序会给进程留出时间,然后可以使用他自己的调度程序在他的线程之间划分时间,但这不是必须的,因为所有线程都是进程,它们位于同一进程表中并且可以运行在任何时候,任何核心,与常规过程相同。
因为线程(对于相同的进程)具有相同的内存,所以它们可以在用户级
进程不应该访问不同进程的已分配内存(除非他是联合空间的线程),因此进程之间的同步应该在某些连接的\ global空间或内核级别上进行强>