进程或线程间同步(互斥锁和条件变量)

为允许在线程或这进程间共享数据,同步通常是必须的。互斥锁和条件变量是同步的基本组成部分。

互斥锁和条件变量总是可用来同步一个进程间内的各个线程的。如果一个互斥锁或条件变量存放在多进程间共享的某个内存区中,那么也允许它用于这些进程间的同步。

应用生产者-消费者问题,使用多个线程而不是多个进程,因为让多个线程共享本问题中采用的公共数据缓冲区非常简单,而在多个进程间共享一个公共数据缓冲区却需要某种形式的共享内存区。

互斥锁:上锁与解锁

互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程在执行其中的代码(假设互斥锁由多个线程共享),或者任何时刻只有一个进程在执行其中的代码(假设互斥锁由多个进程共享)保护一个临界区的代码的通常轮廓大体如下:

lock_the_mutex(...)

临界区

unlock_the_mutex(...)

进程或线程间同步(互斥锁和条件变量)

进程或线程间同步(互斥锁和条件变量)

进程或线程间同步(互斥锁和条件变量)

尽管我们说互斥锁保护的是临界区,实际上保护的是在临界区中被操纵的数据。也就是说,互斥锁通常用于保护由多个线程或多个进程分享的共享数据。

条件变量:条件变量用于等待

条件变量是类型为pthread_cond_t的变量,以下两个函数使用了这些变量

进程或线程间同步(互斥锁和条件变量)

定时等待和广播

通常pthread_cond_signal只唤醒等待在相应条件变量上的一个进程。在某些条件下一个进程认定有多个其他线程应被唤醒,这时调用pthread_cond_broadcast唤醒阻塞在相应条件变量上的所有线程。

进程或线程间同步(互斥锁和条件变量)

互斥锁和条件变量的属性

进程或线程间同步(互斥锁和条件变量)