c++并发编程之线程的互斥与同步

什么是线程的同步与互斥?

  • 互斥:指在某一时刻指允许一个进程运行其中的程序片,具有排他性和唯一性。 
    对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。
  • 同步:指的是在互斥的基础上,实现进程之间的有序访问。假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数据(或B取走数据),B才能来读数据(或A才能往里写数据)。这种关系就是一种线程的同步关系。

那什么是临界资源和临界区呢?

  • 临界资源:能够被多个线程共享的数据/资源。
  • 临界区:对临界资源进行操作的那一段代码

实现线程同步和互斥的几种方法:

  • 内核模式:指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态
    • 互斥量(mutex):为协调共同对一个共享资源的单独访问而设计的。
    • 信号量(Semaphore):为控制一个具有有限数量用户资源而设计。
    • 事 件(event):用来通知线程有一些事件已发生,从而启动后继任务的开始。
  • 用户模式:不需要切换到内核态,只在用户态完成操作。
    • 原子操作(atomic operation):指不会被线程调度机制打断的一个或一系列操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
    • 临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

进程间通信方式:

(1)管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

(2)信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

(3)消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。

(4)共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

(5)信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

(6)套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

上一篇:VS2010调试时候未响应


下一篇:CE寻找游戏基址