知识点:
线程、互斥锁、条件变量
代码如下:
#include #include
#include
#include "ThreadTest.h"//互斥锁
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
//条件变量
pthread_cond_t condPrintA = PTHREAD_COND_INITIALIZER;
pthread_cond_t condPrintB = PTHREAD_COND_INITIALIZER;
//打印a的标志位
bool bPrintA = true;
void *ThreadPrintA(void *pParam)
{
pthread_mutex_lock(&mtx);
for (int i = 0;
i < 10;
++i)
{
while(!bPrintA)
pthread_cond_wait(&condPrintA, &mtx);
printf("A\n");
bPrintA = !bPrintA;
pthread_cond_signal(&condPrintB);
}
pthread_mutex_unlock(&mtx);
return NULL;
}void *ThreadPrintB(void *pParam)
{
pthread_mutex_lock(&mtx);
for (int i = 0;
i < 10;
++i)
{
while(bPrintA)
pthread_cond_wait(&condPrintB, &mtx);
printf("B\n");
bPrintA = !bPrintA;
pthread_cond_signal(&condPrintA);
}
pthread_mutex_unlock(&mtx);
return NULL;
}//线程测试Demo
void main()
{
int ret = 0;
pthread_t pt[2];
ret = pthread_create(&pt[0], NULL, &ThreadPrintB, NULL);
if (ret)
{
printf("pthread_create return -1,process return");
return;
}
sleep(10);
ret = pthread_create(&pt[1], NULL, &ThreadPrintA, NULL);
if (ret)
{
printf("pthread_create return -1,process return");
return;
}
//线程返回值
void *pThreadRet;
for (int i = 0;
i < 2;
++i)
{
ret = pthread_join(pt[i],&pThreadRet);
if (ret)
{
printf("pthread_join return -1,process return");
return;
}
}
}
【linux|linux C/C++交替打印A,B】标志位bPrintA的作用非常明显,如果没有该标志位,那么两个线程同时启动的时候,可能出现这种情况:线程A执行到了唤醒B的条件变量,但B线程还没有获取到互斥锁,获取到锁后线程B无休止的等待被唤醒,而A又在等B唤醒,造成相互等待的死锁局面。
推荐阅读
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- Linux|Linux--网络基础
- linux|apt update和apt upgrade命令 - 有什么区别()
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- linux|2022年云原生趋势
- C/C++|C/C++ basis 02
- Go|Docker后端部署详解(Go+Nginx)
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)