线程同步

 

一、线程同步和线程互斥
       1、线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A线程要完成的任务依赖于B线程的数据。

        2、线程互斥:线程互斥是指对于线程共享的线程资源,在各个线程访问时具有排它性。当有若干个线程要访问同一共享资源时,任何时刻只允许一个线程进行访问,直到占有资源者放弃使用该资源。线程互斥可以看成一种特殊的线程同步

二、线程同步的方式

1.互斥锁

             互斥锁是一种只能在线程之间使用的一种控制临界资源的访问机制,如果一种线程要访问临界资源,则必须先加锁,用完之后解锁。这样,在一个线程访问临界资源的过程中,其他线程加锁就会阻塞,不能进入访问临界资源的临界区,直到访问临界资源的线程使用完后并解锁。

       线程同步

          特点:

                  ①原子性:把一个互斥量锁定为一个原子操作,这以为这操作系统(或pthread函数库)保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。

                   ②唯一性:如果一个线程锁定一个互斥量,在它解除前,没有其他线程可以可以锁定这个互斥量;

                    ③非繁忙等待:如果一个线程已定锁定一个互斥量,第二个线程又去试图锁定这个互斥量,则第二个线程将会别挂起(不占用任何CPU资源),直到第一个线程解除对这个互斥量的锁为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。

      2.读写锁

            读写锁与互斥锁类似,不过读写锁允许更改的并行性。互斥锁要么是锁住状态,要么不加锁,而且一次只有一个线程可以对其加锁。

             读写锁可以有三种状态:读模式状态,写模式状态,不加锁状态。

             一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。

读写锁的特点:

   ① 如果有其他线程读数据,则允许其他线程执行读操作,但不允许写操作。

    ②如果有其他线程写数据,则其他程序都允许读,写操作。

3、自旋锁

      自旋锁和互斥锁的功能一样,但是互斥锁在线程阻塞时会让出cpu,而自旋锁则不会让出cpu,一直等待,直到得到锁。

4.信号量

线程同步

 线程同步

5.条件变量 

       条件变量是利用线程间共享全局变量进行同步的一种机制。

       与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来锁定一个线程,直到某个特殊的条件发生为止。通常条件变量和互斥锁同时发生。

      条件变量可以是我们睡眠等待某种情况的发生。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:

                                          一个线程等待“条件变量的条件成立”而挂起
                                            另一个线程使条件成立
      条件的检测是在互斥锁的保护下进行的。线程在改变条件变量的状态之前必须先锁定互斥量。如果一个条件为假,则线程自动阻塞,并释放等待状态改变的互斥锁。如果另外一个线程改变了条件,它发信号给相关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。

条件变量的操作流程如下:

初始化条件变量
等待条件成立
**条件变量
清除条件变量