【Linux】 多线程编程(互斥锁实现互斥)

线程的优点:减少处理机的空转时间,支持多处理器及减少上下文切换开销

线程的退出不能使用exit(),由于exit()的作用是使调用进程终止,可以使用pthread_exit()

由于一个进程中的多个线程是共享数据段,因此,线程在退出之后,退出线程所占用的资源并不会随着线程的中止而释放,正如进程之间可以用wait()函数来进行同步终止并释放资源一样,线程之间是使用pthread_join()函数

pthread_join()函数用于将当前线程挂起来等待线程的结束,这个函数是一个线程阻塞函数,调用它的函数一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回,pthread_exit()函数是主用终止自身线程,但在很多线程的应用中,经常会遇到别的线程要终止另一个线程的问题,此时调用pthread_cancel()函数来实现这种功能。在被取消的线程的内部需要调用pthread_setcancel()函数和pthread_setanceltype()函数设置自己的取消状态,例如,被取消的进程接收到另一个线程的取消请求之后,需要接受或忽略这个请求。如果接受,则再判断立刻采取终止操作还是等待某个函数的调用

由于线程共享进程的资源和地址空间,在对这些资源进行操作时,就必须要考虑到线程间资源访问的同步与互斥问题

有两种机制:互斥锁和信号量,互斥锁适用于可用资源是唯一的情况,信号量适用于可用资源为多个的情况

互斥锁的基本函数:
1、pthread_mutex_init():互斥锁初始化
2、pthread_mutex_lock():互斥锁上锁
3、pthread_mutex_trylock():互斥锁判断上锁
4、pthread_mutex_unlock():互斥锁解锁
5、pthread_mutex_destory():消除互斥锁

#include 
#include 
#include 

#define THREAD_NUM 3
#define REPEAT_NUM 3
#define DELAY_TIME_LEVLES 5.0

pthread_mutex_t mutex;

void *thread_fun(void *arg)
{
	int no = (int) arg;
	int delay;
	int ret,i;

	ret = pthread_mutex_lock(&mutex);  //返回0为成功
	if(ret)
	{
		printf("Thread %d lock failed\n",no);
		pthread_exit(NULL);
	}

	for(i=0;i



 

你可能感兴趣的:(Linux)