Linux应用编程_多线程编程
(1)线程的创建:
pthread_t tid = pthread_self(); //获取当前线程的tid号
int ret = pthread_create(&tid1,NULL,fun1,(void *)&a);//创建线程传入变量a的地址
ret = pthread_create(&tid2,NULL,fun2,(void *)(long)a);//创建线程传入变量a的值
(2)线程的退出与回收:
pthread_exit((void *)&tmp); //线程主动退出,将变量tmp取地址转化为void*类型传出
pthread_cancel((pthread_t )(long)arg); //杀死线程,使之强制退出
pthread_join(tid1,&Tmp); //线程资源回收(阻塞方式)
if(pthread_tryjoin_np(tid[i],&Tmp) == 0) //线程资源回收(非阻塞方式)
(3)线程的控制:
1)互斥量: 临界资源访问
ret = pthread_mutex_init(&mutex,NULL);//初始化互斥量
pthread_mutex_lock(&mutex);//加锁 若有线程获得锁,则会阻塞
pthread_mutex_unlock(&mutex);//解锁
int pthread_mutex_trylock(pthread_mutex_t *mutex); //互斥量加锁(非阻塞)
pthread_mutex_destroy(&mutex);//销毁互斥量
2)信号量: 线程执行顺序
int sem_init(sem_t *sem,int pshared,unsigned int value); //第二个参数传入0代表线程控制,否则为进程控制;
int sem_wait(sem_t *sem); //(阻塞)检测指定信号量是否有资源可用,执行“sem-1”的操作
int sem_post(sem_t *sem); //(阻塞)释放指定信号量的资源,执行“sem+1”操作
int sem_trywait(sem_t *sem); //信号量申请资源(非阻塞),功能与sem_wait一致
int sem_destory(sem_t *sem); //信号量销毁
示例:
ret = sem_init(&sem1,0,1); //初始化信号量1 并且赋予其资源
ret = sem_init(&sem2,0,0); //初始化信号量2 让其阻塞
ret = sem_init(&sem3,0,0); //初始化信号3 让其阻塞
sem_wait(&sem1);//因sem1本身有资源,所以不被阻塞 获取后sem1-1 下次会会阻塞
sem_post(&sem2);// 使得sem2获取到资源
sem_wait(&sem2);//因sem2在初始化时无资源会被阻塞,直至14行代码执行 不被阻塞 sem2-1 下次会阻塞
sem_post(&sem3);// 使得sem3获取到资源
sem_wait(&sem3);//因sem3在初始化时无资源会被阻塞,直至22行代码执行 不被阻塞 sem3-1 下次会阻塞
sem_post(&sem1);// 使得sem1获取到资源
sem_destroy(&sem1); //销毁信号量
sem_destroy(&sem2);
sem_destroy(&sem3);
3)条件变量:一种同步机制,一般是用来通知对方共享数据的状态信息,因此条件变量是结合互斥量来使用的 ////个人认为:可类比于内核空间的阻塞来理解
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 初始化条件变量
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);//// 初始化条件变量, cond_attr通常为NULL
int pthread_cond_destroy(pthread_cond_t *cond); // 销毁条件变量
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); //等待条件变量,需要结合互斥量一起使用
int pthread_cond_signal(pthread_cond_t *cond); //通知条件变量
示例:
static pthread_mutex_t g_tMutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t g_tConVar = PTHREAD_COND_INITIALIZER;
pthread_mutex_lock(&g_tMutex);
pthread_cond_wait(&g_tConVar, &g_tMutex); // 如果条件不满足则,会 unlock g_tMutex ;条件满足后被唤醒,会 lock g_tMutex
pthread_mutex_unlock(&g_tMutex);
pthread_mutex_lock(&g_tMutex);
pthread_cond_signal(&g_tConVar); /* 通知接收线程 */
pthread_mutex_unlock(&g_tMutex);
参考:韦东山Linux教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」