线程的同步和互斥
2014-08-20 22:48
148 查看
线程:由于进程间的地址空间是私有的,因此在进程间上下文切换时,系统的开销是比较大的。为了提高系统的性能,引入了线程的概念。在同一个进程中创建的线程共享该进程的地址空间。我们通常说的线程实际上就是共享地址空间的多个任务。
线程间通信是非常容易的,比如可以通过全局变量实现数据的共享,但是多个线程同时访问共享对象时需要引入线程的同步和互斥。
线程同步:
同步是指多个线程按照约定的顺序相互配合完成一件事情。一种同步的机制就是:信号量。由信号量来决定线程是继续还是阻塞。
信号量:(分为有名信号量和无名信号量)
1.信号量表示某一类资源,其值就是这类资源的数量
2,信号量是一个受保护的变量,只能通过三种操作来访问。
(1)初始化
(2)P操作(申请资源)
(3)V操作(释放资源)
3.信号量的值为非负整数。
常用的信号量操作函数:
1.函数原型:int sem_init(sem_t *sem, int pshared , unsigned int value)
函数参数:sem :初始化的信号量
pshared : 信号量共享的范围(0:线程间使用;非0,:进程间使用)
value:信号量初始值
函数返回值:成功:0
不成功:-1
该函数用于创建一个信号量并初始化它的值。
2.函数原型:int sem_wait(sem_t *sem)
函数参数:sem :信号量
函数返回值:成功:0
不成功:-1
该函数用于申请信号量即P操作,当信号量sem的值 > 0时,将其值-1;sem < 0时;阻塞线程。
3.函数原型:[b]int
sem_post(sem_t *sem)[/b]
函数参数:sem :信号量
函数返回值:成功:0
不成功:-1
该函数用于申请信号量即V操作,将sem值+1,同时发出信号来唤醒等待的线程。
线程互斥:
1.引入互斥的概念就是为了保证共享数据的完整性。
2.互斥锁主要用来保护临界资源。任何时候只能有一个线程来访问该资源。
3.线程必须获得互斥锁才能访问临界资源,访问结束释放该资源。若无法获得锁则阻塞直到获得为止。
常用的操作函数:
1函数原型:int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr)
函数参数:mutex:互斥锁
attr :互斥锁属性;NULL表示缺省属性。
函数返回值:成功:0
不成功:-1
该函数主要用于初始化互斥锁
2.函数原型:int pthread_mutex_lock(pthread_mutex_t *mutex)
函数参数:mutex:互斥锁
函数返回值:成功:0
不成功:-1
该函数主要用于申请互斥锁
3.函数原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
函数参数:mutex:互斥锁
函数返回值:成功:0
不成功:-1
该函数主要用于释放互斥锁
线程间通信是非常容易的,比如可以通过全局变量实现数据的共享,但是多个线程同时访问共享对象时需要引入线程的同步和互斥。
线程同步:
同步是指多个线程按照约定的顺序相互配合完成一件事情。一种同步的机制就是:信号量。由信号量来决定线程是继续还是阻塞。
信号量:(分为有名信号量和无名信号量)
1.信号量表示某一类资源,其值就是这类资源的数量
2,信号量是一个受保护的变量,只能通过三种操作来访问。
(1)初始化
(2)P操作(申请资源)
(3)V操作(释放资源)
3.信号量的值为非负整数。
常用的信号量操作函数:
1.函数原型:int sem_init(sem_t *sem, int pshared , unsigned int value)
函数参数:sem :初始化的信号量
pshared : 信号量共享的范围(0:线程间使用;非0,:进程间使用)
value:信号量初始值
函数返回值:成功:0
不成功:-1
该函数用于创建一个信号量并初始化它的值。
2.函数原型:int sem_wait(sem_t *sem)
函数参数:sem :信号量
函数返回值:成功:0
不成功:-1
该函数用于申请信号量即P操作,当信号量sem的值 > 0时,将其值-1;sem < 0时;阻塞线程。
3.函数原型:[b]int
sem_post(sem_t *sem)[/b]
函数参数:sem :信号量
函数返回值:成功:0
不成功:-1
该函数用于申请信号量即V操作,将sem值+1,同时发出信号来唤醒等待的线程。
线程互斥:
1.引入互斥的概念就是为了保证共享数据的完整性。
2.互斥锁主要用来保护临界资源。任何时候只能有一个线程来访问该资源。
3.线程必须获得互斥锁才能访问临界资源,访问结束释放该资源。若无法获得锁则阻塞直到获得为止。
常用的操作函数:
1函数原型:int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr)
函数参数:mutex:互斥锁
attr :互斥锁属性;NULL表示缺省属性。
函数返回值:成功:0
不成功:-1
该函数主要用于初始化互斥锁
2.函数原型:int pthread_mutex_lock(pthread_mutex_t *mutex)
函数参数:mutex:互斥锁
函数返回值:成功:0
不成功:-1
该函数主要用于申请互斥锁
3.函数原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
函数参数:mutex:互斥锁
函数返回值:成功:0
不成功:-1
该函数主要用于释放互斥锁
相关文章推荐
- Linux利用信号量实现线程的同步与互斥
- Java线程同步和互斥
- 为了在线程间进行可靠的通信,也为了互斥访问,同步是必要的。
- 多线程编程2--线程的同步和互斥
- Linux 编程之【线程】同步与互斥
- [Linux C编程]线程之间的同步与互斥
- 线程的同步与互斥(死锁的产生和避免)
- 线程的同步与互斥---生产者消费者模型
- linux中线程的同步与互斥
- 线程之间的互斥和同步
- JAVA线程互斥、同步详解
- BCB线程的互斥与同步
- Python线程间的同步与互斥
- 线程的同步和互斥
- 线程之间的同步和互斥
- Linux线程浅析[线程的同步和互斥之线程互斥锁]
- Linux线程浅析[线程的同步和互斥之线程读写锁]
- Windows线程的同步与互斥
- java线程同步与互斥
- <linux线程>同步互斥机制之【条件变量】