Linux期末复习——多线程编程

线程概述

        Linux期末复习——多线程编程_第1张图片

线程基本编程

        函数说明 

pthread_create():  创建线程,成功返回0
pthread_exit():   主动退出线程,成功返回0
pthread_join():   挂起线程等待结束,成功返回0
pthread_cancel 在别的线程中终止另一个线程的执行,成功返回0

        示例代码:创建三个线程,每个线程重用同一个执行,每个线程五次循环,每次循环随机等待1-10s。

        

/* thread.c */

#include 
#include 
#include 

#define THREAD_NUMBER		3    /*宏定义线程数量*/
#define REPEAT_NUMBER		5    /*宏定义每个线程的任务数量*/
#define DELAY_TIME_LEVELS	10.0/*小任务之间的最大时间间隔*/

/*定义线程处理过程的函数*/
void * thrd_func(void *arg)
{
	int thrd_num = (int)arg;
	int delay_time = 0;
	int count = 0;
	
	printf("Thread %d is starting\n", thrd_num);

	/*循环每个线程调用这个线程处理函数的时候要进行五次任务,所以循环五次*/
	for (count = 0; count < REPEAT_NUMBER; count++)
	{		
		delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
		sleep(delay_time);
        /*线程几:工作 几 次 等待 几 秒*/
		printf("\tThread %d: job %d delay = %d\n", thrd_num, count, delay_time);
	}
	printf("Thread %d finished\n", thrd_num);/*五次任务做完要输出线程几完成了*/
	pthread_exit(NULL);
}

/*主函数*/
int main(void)
{

     /*结构体解释:
    typedef unsigned long int pthread_t;  
    用途:pthread_t用于声明线程ID。    
    sizeof(pthread_t) =4;*/

    /*先赋值工作数*/
	pthread_t thread[THREAD_NUMBER];
       

	int no = 0, res;
	void * thrd_ret;
	
	srand(time(NULL));
        /*
          time(NULL);就是返回从1970年元旦午夜0点到现在的秒数。 srand(time(NULL)); 是以当前时间为种子,产生随意数。

          srand和rand()配合使用产生伪随机数序列。
          rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。
          如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。
          srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,
          从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,
          即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列  
        */

	/*循环创建三个线程*/
	for (no = 0; no < THREAD_NUMBER; no++)
	{
		res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);
                /*
                 &thread[no]:线程标识符,表示线程的标号;
                   NULL:线程属性,通常取NULL; 
                   thrd_func:线程处理函数;
                   (void*)no:传递给线程处理函数的参数;
                              函数成功执行返回0,出错返回错误码;
 
                  pthread_create()函数作用,创建一个线程,并指定线程处理函数thrd_func,从而执行该函数规定的动作;
                */
		if (res != 0)
		{
			printf("Create thread %d failed\n", no);/*pthread_create失败返回0*/
			exit(res);
		}
	}
	
	printf("Create threads success,Waiting for threads to running..\n");/*成功输出这句*/
	
    /*循环挂起线程*/
	for (no = 0; no < THREAD_NUMBER; no++)
	{
		res = pthread_join(thread[no], &thrd_ret); //&thrd_ret:用户定义的指针,用来存储被等待线程结束时返回值;
                /*pthread_join使一个线程等待另一个线程结束。                  
                  代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。
                  加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
                  该函数作用:当thread[no]尚未运行结束时,调用pthread_join()的主进程阻塞,直到thread[no]线程退出,该线程所占据的资源才被释放,主进程才能结束;
                  主进程等待线程运行结束后,pthread_join函数返回0,该线程资源释放;如果出错返回错误码;
           
                */
		if (!res)
		{
			printf("Thread %d joined\n", no);/*该语句打印出来代表thread[no]已经结束运行,释放其占据的资源*/
		}
		else
		{
			printf("Thread %d join failed\n", no);
		}
	}
	
	return 0;        
}

线程之间的同步互斥 

        信号量适用于同时可用的资源是多个

        互斥锁适用于同时可用的资源唯一

互斥锁线程控制

        

互斥锁基本函数
互斥锁初始化 pthread_muttex_init
互斥锁上锁         pthread_muttex_lock
互斥锁判断上锁 pthread_muttex_trylock()
互斥锁解锁 pthread_muttex_unlock
消除互斥锁 pthread_muttex_destroy

        示例代码(是在上一个示例基础上增加了互斥锁的功能):

        

/* thread_mutex.c */
#include 
#include 
#include 
#define THREAD_NUMBER		3      /*有三个线程*/
#define REPEAT_NUMBER		3      /*每个线程三个任务*/
#define DELAY_TIME_LEVELS	10.0   /*每个线程任务随机等待1-10s*/
pthread_mutex_t mutex;

/**/
void * thrd_func(void *arg)
{
	int thrd_num = (int)arg;
	int delay_time = 0, count = 0;
	int res;
	
	res = pthread_mutex_lock(&mutex); /*上互斥锁,成功返回0,非0值代表失败,并返回出错信息;*/	
	if (res)
	{
        /*上锁失败*/
		printf("Thread %d lock failed\n", thrd_num);	
		pthread_exit(NULL);
	}
    /*上锁成功输出一句线程开始*/	
	printf("Thread %d is starting\n", thrd_num);
    /*三次任务*/
	for (count = 0; count < REPEAT_NUMBER; count++)
	{	
        delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
		sleep(delay_time);
	    printf("\tThread %d: job %d delay = %d\n", thrd_num, count, delay_time);
	}
    /*线程完成*/
	printf("Thread %d finished\n", thrd_num);
	/*主动停止线程*/	    
	pthread_exit(NULL);
}

int main(void)
{
    /*一些定义*/
	pthread_t thread[THREAD_NUMBER];
	int no = 0, res;
	void * thrd_ret;
	
	srand(time(NULL));
	
    /*互斥锁初始化*/
	pthread_mutex_init(&mutex, NULL);
    /*参数解释:
    &mutex创建互斥锁,都这么写
    NULL表示创建的是快速互斥锁,调用线程会阻塞直至拥有互斥锁的线程解锁为止,知道有这么回事就好            
    */
    
    /*循环创建三个线程*/
	for (no = 0; no < THREAD_NUMBER; no++)
	{
        /*线程号,默认NULL,线程处理函数,传递参数*/
		res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);
		if (res != 0)
		{
			printf("Create thread %d failed\n", no);/*报错*/
			exit(res);
		}
	}
	
	printf("Create threads success\n Waiting for threads to finish...\n");/*创建成功,等待线程创建完毕*/

    /*做三次任务,每个线程挂起,防止退出太快*/
	for (no = 0; no < THREAD_NUMBER; no++)
	{
		res = pthread_join(thread[no], &thrd_ret);
		if (!res)
		{ 
            printf("Thread %d joined\n", no); 
        }
		else
		{  
            printf("Thread %d join failed\n", no); 
        }
		pthread_mutex_unlock(&mutex);/*解开互斥锁*/		
	}	
	pthread_mutex_destroy(&mutex);	/*消除(删除)互斥锁*/
	return 0;        
}

       信号量线程控制

        互斥锁是一种特殊的信号量,互斥锁初始值为1,信号量初始值为0

你可能感兴趣的:(linux)