线程的同步和互斥

线程:由于进程间的地址空间是私有的,因此在进程间上下文切换时,系统的开销是比较大的。为了提高系统的性能,引入了线程的概念。在同一个进程中创建的线程共享该进程的地址空间。我们通常说的线程实际上就是共享地址空间的多个任务。

线程间通信是非常容易的,比如可以通过全局变量实现数据的共享,但是多个线程同时访问共享对象时需要引入线程的同步和互斥。


线程同步:

同步是指多个线程按照约定的顺序相互配合完成一件事情。一种同步的机制就是:信号量。由信号量来决定线程是继续还是阻塞。

信号量:(分为有名信号量和无名信号量)

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.函数原型int sem_post(sem_t *sem)

   函数参数: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

该函数主要用于释放互斥锁




  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值