浅谈C++中的多线程(二)

本篇文章围绕以下几个问题展开:

  1. 何为进程?何为线程?两者有何区别?
  2. 何为并发?C++中如何解决并发问题?C++中多线程的语言实现?
  3. 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法
  4. Qt中的多线程应用

上一篇文章讲解了前两个问题,本篇文章来讲解第三个问题。

三.同步互斥原理以及多进程和多线程中实现同步互斥的两种方法

1.同步互斥原理

 同步互斥其实包含两个概念:同步和互斥。同步是合作进程(或线程)间的直接制约问题,互斥是申请临界资源进程(或线程)间的直接制约问题。

备注:个人认为,多进程和多线程中都存在着同步互斥问题,但下面的内容主要讲解多线程中的同步互斥,一方面是C++11中更多使用的是多线程来解决并发问题,另一方面本篇文章的重点也是讲解C++11中的多线程。

首先说明两个专业名词。

临界资源:对于同一进程的多个线程,进程资源中有些对线程是共享的,但有些资源一次只能供一个线程使用,这样的资源被称为临界资源,也可以叫做互斥资源,即只能被各个线程互斥访问。

临界区:线程中对临界资源实施操作的那段程序,称之为临界区。

1.1.线程间的同步

线程的同步是指在一些确定点上需要线程之间相互合作,协同工作。个人认为,说白了就是在访问同一个临界资源(互斥资源)时,两个线程间必须有一个先后顺序,因为临界资源一次只能供一个线程使用,如果两个线程都想要访问,那岂不乱套了,这回形成死锁,后面会讲。

举例:假如程序中有一个静态变量,static int a;线程1负责往里写入数据,线程2需要读取其中的数据,那么线程2在读数据之前必须是线程1写入了数据,如果不是,那么线程2必须停下来等待线程1的操作结束。这就是线程之间在某些地方上的合作关系,协同工作嘛!

1.2.线程间的互斥

线程的互斥是指同一进程中的多个线程之间因争用临界资源而互斥的执行,即一次只能有一个线程访问临界资源。 

举例:还是假如程序中有一个静态变量,static int b;线程1想要往里写入数据,线程2也想要往里写入数据,那么此时静态变量b就是一个临界资源(互斥资源),即一次只能被一个线程访问。想一想,如果线程1和线程2同时往b中写入数据,那怎么能行,计算机是不允许的!所以,要么是线程1占用b,此时线程2要等待;要么是线程2占用b,此时线程1等待。这就是所谓的线程间的互斥,这里可以通过加锁的方式来实现,后面会讲。

备注:在这里要说明一下自己认识上的一个错误,之前我以为 同步是对于线程来说的,而互斥是对于临界资源来说的,现在看来这是错误的,因为同步跟互斥都是针对于线程来说的,可以把这理解为是线程之间的合作关系和制约关系。可以这样理解,同一进程的各个线程之间不可能是完全独立的,或多或少会有关系,或是合作关系,或是制约关系。具体的例子放在了同步和互斥的介绍中。     

2.多线程中实现同步互斥的两种方法

    C++11中实现多线程间同步与互斥有两种方法:信号量机制和锁机制,其中锁机制最为常用。

3.多进程中实现同步互斥的两种方法

多进程中实现同步互斥仍然可以采用信号量机制和锁机制,但个人理解在语言实现上是用操作系统的原语,难于理解,所以这里不再赘述,只需要掌握其原理即可。

有没有发现,其实进程和线程有很多相像的地方,因为线程被称为是轻量化进程嘛!

四.Qt中的多线程应用

本章节主要讲解Qt中实现多线程的两种方式以及实现线程同步的方法。

按照惯例,先来一个小引入吧:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

发布了34 篇原创文章 · 获赞 22 · 访问量 7194

猜你喜欢

转载自blog.csdn.net/lizun7852/article/details/88774418