线程同步-互斥锁-unix网络编程

       在Unix系统中,提供一种基本的线程同步机制——互斥锁。它是一种锁,可以用来保护线程代码中共享数据结构的完整性。它具有以下3个特点。
       *对互斥锁的操作(加锁/解锁)是原子操作,这就意味着操作系统将保证同时只有一个线程能成功完成对一个互斥锁的加锁操作。
       *如果一个线程已经对某一互斥锁进行了加锁,其他线程只有等待该线程完成对这一互斥锁解锁后,才能完成加锁操作。
       *如果一个线程已经对某一加锁的互斥锁进行了加锁操作,该线程将被挂起。只有当该互斥锁被解锁后,该线程才被唤醒并完成加锁操作。 
       利用互斥锁可以保证在某一时间内,只有一个线程能执行“关键”代码。通常,这些“关键”代码是用于修改共享数据的,从而保证其数据的完整性。

       具体的实现方法是:在“关键”代码前加锁某一互斥锁,在“关键”代码结束时解锁该互斥锁。对于上一节的例
子,可用以下伪代码实现数据的完整性。
       加锁互斥锁X1;
       修改变量id;
       修改变量name;
       解锁互斥锁X1。

       定于静态互斥锁:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

       动态互斥锁:#include <pthread.h>

       int   pthread_mutex_init(pthread_mutex_t    *mutex,
                    const pthread_mutexattr_t *attr);

      mutex:指向一个将被初始化的互斥锁。
      attr:一个可选的  pthread_mutexattr_t 指针。这个结构可用来设置互斥锁的各种属性。但是通常并不需要这些属性,所以一般把它指定为  NULL。

      返回值:成功时都返回0,否则返回错误码。

      #include <pthread.h>
      int pthread_mutex_destroy(pthread_mutex_t *mutex);

      pthread_mutex_destroy()函数释放创建互斥锁时分配给它的任何资源。但不会释放用来存储  pthread_mutex_t 的内存。另外,不要撤销已被加锁的互斥锁。

       1.加锁函数pthread_mutex_lock()
        pthread_mutex_lock() 函数接受一个指向互斥锁的指针作为参数并将其锁定。如果互斥锁已经被锁定,调用者将进入睡眠状态。函数返回时,将唤醒调用者。该函数原型如下:
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
mutex:指向互斥锁的指针。
返回值:成功时都返回0,否则返回错误码。
      2.加锁函数pthread_mutex_trylock()
      pthread_mutex_trylock()函数也可用于互斥锁的锁定,并且如果线程正在做其他事情(由于互斥锁当前是锁定的),而希望锁定该互斥锁,这个调用就相当方便。调用 pthread_mutex_trylock()函数时将尝试锁定互斥锁。如果互斥锁当前处于解锁状态,那么完成锁定并且函数将返回零。然而,如果互斥锁已锁定,这个调用也不会阻塞。它
会返回非零的  EBUSY  错误值。然后可以继续做其他事情,稍后再尝试锁定。该函数原型如下:
#include <pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);

      3.解锁函数pthread_mutex_unlock()
      pthread_mutex_unlock()函数用于互斥锁的解锁操作。该函数原型如下:
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
mutex:指向互斥锁的指针。
返回值:成功时都返回0,否则返回错误码。
        使用互斥锁时,应该尽快对已加锁的互斥锁进行解锁(以提高性能)。并且绝对不要对未加锁的互斥锁进行解锁操作(否则,pthread_mutex_unlock()函数调用将失败并返回一个
非零的  EPERM 返回值)。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭