Linux多线程编程|线程基本编程

线程基本编程

1. 线程简介

为了进一步减少处理机的空转时间,支持多处理器,以及减少上下文切换开销,进程在演化过程中出现了另一个概念------线程。它是进程内独立的一条运行线路,是处理器调度的最小单元,也称为轻量级进程。由于线程的高效性和可操作性,在嵌入式系统开发中应用非常广泛。
一个进程中的多个线程共享的资源有:可执行的指令、静态数据、进程中打开的文件描述符、当前工作目录、用户ID和用户组ID
每个线程私有的资源包括:线程ID(TID)、PC(程序计数器)和相关寄存器、堆栈、错误号、优先级、执行状态和属性

2. 编程说明

Linux中,一般pthread线程库是一套通用的线程库,由POSIX提出的,具有很好的可移植性。pthread线程库提供了如下基本操作:

  • 创建线程:确定调用该线程函数的入口点,使用 pthread_create() 函数
  • 回收线程:线程退出后释放其所占用的资源,使用 pthread_join() 函数
  • 结束线程:退出线程,是线程的主动行为,使用 pthread_exit() 函数
  • 线程中结束另一个线程:使用 pthread_cancel() 函数

3. 函数介绍

pthread_create()

/*****pthread_create()函数*****/
函数原型:int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void*),void *arg)
传 入 值:thread 线程标识符
		 attr 线程属性设置(详见属性介绍章节),通常取为NULL
		 start_routine 线程函数的起始地址,是一个以指向void的指针作为参数和返回值的函数指针
		 arg 传递给 start_routine 的参数
返 回 值:成功:返回0;失败:返回错误码

pthread_join()

/*****pthread_join()函数*****/
函数原型:int pthread_join(pthread_t th,void **thread_return)
传 入 值:th 等待线程的标识符
		 thread_return 用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)
返 回 值:成功:返回0;失败:返回错误码

pthread_exit()

/*****pthread_exit()函数*****/
函数原型:void pthread_exit(void *retval)
传 入 值:retval 线程结束时的返回值,可由其他函数如pthread_join()来获取

pthread_cancel()

/*****pthread_cancel()函数*****/
函数原型:int pthread_cancel(pthread_t th)
传 入 值:th 要取消的线程的标识符
返 回 值:成功:返回0;失败:返回错误码

4. 编程实例

以下实例创建了3个线程,为了更好地描述线程之间的并行执行,让3个线程共同用一个执行函数。每个线程都有5次循环,每次循环之间会随机等1~10秒,意义在于模拟每个任务的到达时间是所及的,并没有特定规律

/*****thread.c*****/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#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(){
    
    
	pthread_t thread[THREAD_NUMBER];
	int no = 0,res;
	void * thrd_ret;

	srand(time(NULL));
	for(no = 0;no < THREAD_NUMBER;no++){
    
    
		res = pthread_create(&thread[no],NULL,thrd_func,(void*)no);
		if(res != 0){
    
    
			printf("Create thread %d failed\n",no);
			exit(res);
		}
	}
	printf("Create thread sucess\nWaiting for threads to finish...");
	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);		
	}
	return 0;
}

以下是运行结果,可看出每个线程的运行和结束时无序、独立与并行的

linux@linux-virtual-machine:~/andy/proc$ ./thread
Create threads sucess
Waiting for threads to finish...
Thread 0 is starting
Thread 1 is starting
Thread 2 is starting
		Thread 1: job 0 delay = 6
		Thread 2: job 0 delay = 6
		Thread 0: job 0 delay = 9
		Thread 1: job 0 delay = 6
		Thread 2: job 0 delay = 8
		Thread 0: job 0 delay = 8
Thread 2 finished
		Thread 1: job 2 delay = 10
		Thread 1: job 3 delay = 4
		Thread 1: job 4 delay = 1
Thread 1 finished
		Thread 0: job 3 delay = 9
		Thread 0: job 4 delay = 2
Thread 0 finished	
Thread 0 joined
Thread 1 joined
Thread 2 joined

猜你喜欢

转载自blog.csdn.net/Chuangke_Andy/article/details/108355912