二 Linux--多线程( 四 )


  • 将所有资源进行线性排序,每个进程申请资源的顺序保持一致
  • 实例演示:
    #include <stdio.h>#include <pthread.h>#include <unistd.h>//线程的两个互斥量pthread_mutex_t mutex1;pthread_mutex_t mutex2;//线程1处理函数void *fun1(void *arg){    //线程1先申请资源1,再申请资源2    //加锁    pthread_mutex_lock(&mutex1);    printf("线程1加锁资源1ok....\n");    pthread_mutex_lock(&mutex2);    printf("线程1加锁资源2ok....\n");    printf("线程1执行临界代码");    //解锁    pthread_mutex_unlock(&mutex1);    pthread_mutex_unlock(&mutex2);    return NULL;  }//线程2处理函数void *fun2(void* arg){    //线程2先申请资源2,再申请资源1    //加锁    pthread_mutex_lock(&mutex2);    printf("线程2加锁资源1ok....\n");    pthread_mutex_lock(&mutex1);    printf("线程2加锁资源2ok....\n");    printf("线程2执行临界区代码....\n");    //解锁    pthread_mutex_unlock(&mutex2);    pthread_mutex_unlock(&mutex1);    return NULL;}//演示死锁int main(){    int ret = -1;    int ret1 = -1;    pthread_t tid1,tid2;    //初始化互斥量    pthread_mutex_init(&mutex1,NULL);    pthread_mutex_init(&mutex2,NULL);    //创建两个线程    pthread_create(&tid1,NULL,fun1,NULL);    pthread_create(&tid2,NULL,fun2,NULL);    //回收资源    ret = pthread_join(tid1,NULL);    ret = pthread_join(tid2,NULL);    if(0!=ret)    {      printf("线程1资源回收失败\n");      return 1;    }    if(0!=ret1)    {      printf("线程2资源回收失败\n");      return 1;    }    //销毁互斥锁    pthread_mutex_destroy(&mutex1);    pthread_mutex_destroy(&mutex2);    return 0;}运行结果如下:
    二 Linux--多线程

    文章插图
    两个进程都想获得对方的锁,造成死锁 。
    条件变量概念利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”(给出条件成立信号) 。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起 。
    同步: 在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而避免饥饿问题,叫做同步
    为什么存在线程同步?
    线程同步使得每个线程都能够访问临界资源,多个线程协同高效完成某些任务 。
    条件变量如何与互斥锁结合使用?
    条件变量是包含一个等待队列的 。多个线程可以去竞争一把锁,没有得到锁资源的线程会在锁上继续挂起等待,当拥有锁的线程条件变量满足时,会先释放锁资源,然后进入到条件变量的等待队列去等待(等待其他线程唤醒),这样其他线程就可以获得锁资源,如果此时唤醒的条件变量满足,该线程可以去唤醒等待队列中的第一个线程,自己释放锁资源,然后让第一个线程重新拥有锁资源,依次如此,多个线程就是顺序地执行工作 。这样就可以实现线程同步的操作 。

    经验总结扩展阅读