多线程和多进程应用程序的锁定机制有什么区别?

时间:2012-01-14 20:30:19

标签: c++ windows multithreading multiprocessing critical-section

我有一段代码处理多线程(有共享资源)问题,如:

CRITICAL_SECTION gCS;
InitializeCriticalSection(&gCS);

EnterCriticalSection(&gCS);
// Do some shared resources stuff 
LeaveCriticalSection(&gCS);

this MSDN page中写道:“单个进程的线程 [我的粗体]可以使用关键部分对象进行互斥同步。”

所以,我的问题是:操作系统决定将线程分成不同的进程,甚至是不同的处理器。

EnterCriticalSection确实不能胜任这项工作吗?如果答案是“关键部分对多处理没有帮助”,那么替代方案是什么?

我不想使用Boost类。

4 个答案:

答案 0 :(得分:4)

操作系统不会将线程划分为不同的进程。

EnterCriticalSection适用于具有多个线程的程序,以及具有多个处理器的系统。

答案 1 :(得分:4)

  

所以,我的问题是操作系统的情况如何   决定将theards划分为不同的过程,甚至不同   处理器。

不同的处理器 - 关键部分涵盖了这一点。

不同的流程 - 您需要不同的synchronization API,它们可以在流程之间共享[kernel]对象,例如mutexessemaphores

请参阅Using Mutex Objects部分中的示例用法。

答案 2 :(得分:2)

如果所有线程都在同一个程序中启动,那么它们就是单个进程的一部分,并且没有任何人(包括操作系统)能够“分离它们”。它们仅作为该过程的一部分存在,并将随着该过程而死亡。使用关键部分非常安全。

答案 3 :(得分:-1)

  1. 为进程分配了一个新的地址空间(堆栈和堆),而在创建一个线程时,它会隐式分配启动器进程的内存空间,但是为新分配的自有堆栈空间(一个新的堆栈空间)被分配给每个不同的线程)

  2. 对于操作系统,线程执行的过程与进程相同,当然使用线程时,这可能会导致更多缓存和内存\页面命中。

  3. 操作系统执行程序会给进程留出时间,然后可以使用他自己的调度程序在他的线程之间划分时间,但这不是必须的,因为所有线程都是进程,它们位于同一进程表中并且可以运行在任何时候,任何核心,与常规过程相同。

  4. 因为线程(对于相同的进程)具有相同的内存,所以它们可以在用户级

  5. 上的变量\锁定对象上进行同步
  6. 进程不应该访问不同进程的已分配内存(除非他是联合空间的线程),因此进程之间的同步应该在某些连接的\ global空间或内核级别上进行