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

线程的退出不能使用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 <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#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<REPEAT_NUM;i++)
	{
		delay = (int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;
		sleep(delay);
		printf("Thread %d: job %d delay = %d\n",no,i,delay);
	}
	printf("Thread %d finished\n",no);
	pthread_exit
}

int main()
{
	pthread_t thread[THREAD_NUM];
	int i,ret;
	void *thrd;

	srand(time(NULL));

	pthread_mutex_init(&mutex,NULL);

	for(i=0;i<THREAD_NUM;i++)
	{
		ret = pthread_create(&thread[i],NULL,thread_fun,(void *)i);
		if(ret!=0)
		{
			printf("Create %d failed\n",i);
			exit(ret);
		}
	}

	printf("Create thread success!\n Waiting for threads to finish ...\n");

	for(i=0;i<THREAD_NUM;i++)
	{
		ret = pthread_join(thread[i],&thrd);
		pthread_mutex_unlock(&mutex);
	}
	pthread_mutex_destroy(&mutex);
	return 0;
}



 

Logo

更多推荐