线程-----互斥量

   作者:下家山

一:互斥锁实例

1.1 代码是最后的了解手段

题目:有四个线程,T1,T2,T3,T4。其中T1,T2,T3三个线程负责给共享资源sum【全局变量】加1,T4检测当sum到达100的时候,打印sum的值,并清零,通知其他线程结束。

 

1.2 设计思路:

    T1,T2,T3的代码我们可以共享,代码框架如下:

Void *T123_Work(void *arg)
{

  While(!work_end){//如果结束标志为0
     pthread_mutex_lock(lock_add);//
对共享变量加之前上锁
     sum++;

     Printf(“0x%lx   reach  %d\n”,pthread_self(),sum);//输出共享变量的值,并带上线程ID,因为3个线程都在对sum1
     pthread_mutex_unlock(lock_add);//
加完后释放锁

   }
}

T4的代码,如下:

Void *T4_Work(void *arg)
{
      while (!work_end)//
如果结束标志为0
      {
            pthread_mutex_lock(lock_add);//
判断共享变量sum前上锁
            if(sum>=100)
            {
              printf(“sum reach 100!\n”);//
共享变量到达100后,并解锁
              pthread_mutex_unlock(lock_add);
            }else{

         Printf(“Please add sum...\n”);//不够100,提示再加
              pthread_mutex_unlock(lock_add);
              sleep(5); //
给其他线程足够的时间让他们加     
            }
      }
}

1.3 实例代码

线程-----互斥量

线程-----互斥量

1.4 编译执行结果

线程-----互斥量

1.5 实例解析

线程-----互斥量

1.6 模拟场景

线程-----互斥量

二:怎么解决上述矛盾?

       条件变量!

线程-----互斥量

线程-----互斥量

线程-----互斥量

2.1 代码:

线程-----互斥量

线程-----互斥量

线程-----互斥量

2.2 编译执行结果

 

线程-----互斥量

3.3 实例解析

线程-----互斥量

线程-----互斥量

线程-----互斥量