作者:下家山
一:互斥锁实例
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个线程都在对sum加1
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 编译执行结果