您的位置:首页 > 其它

线程的同步和互斥

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

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

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 同步 互斥