互斥锁,信号量,条件变量,读写锁

互斥锁

互斥锁的特性:

1. 原子性:当有一个线程成功拿到了这个锁,其他线程都无法在相同的时间拿到这个锁

2. 唯一性:在一个线程拿到锁的这段时间,只有当这个线程把锁释放掉,其他的线程才有可能拿到

3. 非繁忙等待性:如果一个线程已经锁定了一个互斥量,第二个线程又视图去拿到这个锁的前线,则第二个锁将被挂起,等待第一个线程对互斥量解锁位置,同时第二个线程获取锁,继续往下执行

pthread_mutex_init
pthread_mutex_lock
pthread_mutex_trylock
pthread_mutex_unlock
pthread_mutex_destroy

信号量

信号量相当于一个加强版的互斥锁,提高了共同访问共享资源的线程数目(从串行,变成了并行)

sem_init
sem_wait
sem_trywait
sem_post
sem_getvalue
sem_destroy

条件变量

自动阻塞一个线程,直到某种特殊的情况发生为止,通常条件变量和互斥锁相互配合使用。

条件变量使得我们可以睡眠等待某种条件出现,条件变量是利用线程间共享的全局变量进行同步的一个机制。

条件变量主要包括两个动作:

1. 一个线程等待 “条件变量的成立“

2. 另一个线程使得 “条件成立”

条件变量的作用:

1. 先把调用线程放到等待条件的队列上

2. 释放指定的锁以提供其他线程添加任务

3. 等待任务添加完毕

4. 在函数调用返回的时候把mutex锁住

具体理解

就是两个线程需要进行碰头,在条件变量这个地方发生,一个线程修改变量使得它满足其他线程继续往下执行的条件,其他线程则接受条件已经发生改变的信号。可以实现无竞争,就是信号可以被所有等待这个信号的进程接受

条件的检测是在互斥锁的保护下进行的,线程在改变条件之前必须先拿到锁的权限。当条件成立的时候,会发送给关联的条件变量

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t * mutex);

mutex的作用是保护条件变量,调用这个函数的时候,mutex会自动释放,等待其他线程发出cond这个信号。

这两个步骤必须是原子性的,如果 释放mutex的时候,别的线程发出了信号,然后这个时候还没有把调用线程放到等待队列上,这个signal信号就会丢失。

为什么需要加锁。并且将这两部分合成原子操作?

如果不加锁的话,当我们先释放mutex的时候,到signal还有一段距离,如果这一段我们发出了signal,处理者线程是有很大可能无法收到signal的。比如等到singal发出来的时候,调用线程还没到等待队列上,而这个时候signal可能已经被其他线程接受了

为什么要先释放锁,然后等待信号发过来?

结合线程池的设计思路,如果不释放锁的话,这个信号有很大可能是发送不过来的,其他的线程可能根本没有机会发出信号。

读写锁

遵循读时共享,写时独占

原文地址:https://www.cnblogs.com/letlifestop/p/11680278.html

时间: 2024-10-07 18:16:02

互斥锁,信号量,条件变量,读写锁的相关文章

Linux互斥锁、条件变量和信号量

Linux互斥锁.条件变量和信号量  来自http://kongweile.iteye.com/blog/1155490 博客分类: Linux sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享.sem_wait:一直阻塞等待直到信号量>0.sem_timedwait:阻塞等待若干时间直到信号量>0.sem_post:使信号量加1.sem_destroy:释放信号量.和sem_init对应. 进行多线程编程,最应该注意的就是那些共享的数据

[转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http://blog.csdn.net/locape/article/details/6040383 http://www.cnblogs.com/liuweijian/archive/2009/12/30/1635888.html 一.什么是多线程? 当我自己提出这个问题的时候,我还是很老实的拿着操作系

线程的互斥锁和条件变量通信机制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <pthread.h> 5 6 #define BUFFER_SIZE 2 7 struct prodcons 8 { 9 int buffer[BUFFER_SIZE]; 10 pthread_mutex_t lock; 11 int readpos,writepos; 12 pthread_cond_t no

linux 线程的同步 二 (互斥锁和条件变量)

互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多进程分享的共享数据.一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码.一般加锁的轮廓如下: pthread_mutex_lock() 临界区 pthread_mutex_unlock() 互斥锁API pthread_mutex

UNIX网络编程:互斥锁和条件变量

在网络编程中,一般都是多线程的编程,这就出现了一个问题:数据的同步与共享.而互斥锁和条件变量就是为了允许在线程或进程间共享数据.同步的两种最基本的组成部分.它们总能够用来同步一个进程中的多个线程. 再进入互斥锁和条件变量之前,我们先对多线程的一些相关函数进行简单介绍: 多线程简单介绍和相关函数: 通常,一个进程中包括多个线程,每个线程都是CPU进行调度的基本单位,多线程可以说是在共享内存空间中并发地多道执行程序,与进程相比,线程的具有以下优点: ● 减少系统调度开销.由于线程基本不拥有资源,因此

多线程之互斥锁、条件变量

多线程 一个进程在同一时刻只能做一件事,而多个线程却可以同时执行,每个线程处理各自独立的任务.多线程有很多好处: 简化处理异步事件的代码 实现内存和文件描述符的共享 改善程序的吞吐量 改善响应时间 互斥锁 互斥锁:互斥锁通过锁机制来实现线程间的同步,在同一时刻通常只允许一个关键部分的代码 当多个线程控制相同的内存时,对于读写操作的时间差距就有可能会导致数据的不同步,下图就很清晰的说明了这种情况: 对于线程A.B此时对同一块内存进行操作,但是由于操作几乎是同时进行的,假设当线程A读入数据i之后,在

互斥锁和条件变量(pthread)相关函数

互斥锁 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 // mptr通常被初始化为PTHREAD_MUTEX_INITIALIZER int pthread_mutex_lock(pthread_mutex_t *mptr); int pthread_mutex_trylock(pthread_mutex_t *mptr); // pthread_mutex_lock 函数的非阻塞模式 int pthread_mutex_unlock(pthread_m

Linux下多线程编程之互斥锁、条件变量、信号量

1.进程创建 int pthread_create (pthread_t * thread_id, __const pthread_attr_t * __attr, void *(*__start_routine) (void *), void *__restrict __arg); 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数. 一个实例: void *producer(void *args); pthread_

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

信号量、互斥锁和条件变量的区别

1.互斥锁总是必须由给其上锁的线程解锁,信号量的挂出确不必由执行过它的等待操作的同一线程执行. 生产者与消费者伪代码 2.互斥锁要么被锁住,要么被解锁(二值状态,类似于二值信号量) 3.既然信号量有一个与之关联的状态(它的数值),那么信号量的挂出操作总是被记住.然而当向一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么信号将丢失. ps:提供信号量的原因是,在进程间同步的情况下,若没有涉及到共享内存区时,需要使用信号量. 原文地址:https://www.cnblogs.com/rab