Linux应用编程_多线程编程

发布时间 2023-09-05 23:00:38作者: charlie12345
(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教程