Linux——线程基础

来源:互联网 发布:安卓版千里眼偷窥软件 编辑:程序博客网 时间:2024/05/20 12:22

线程管理


说到线程我们可能会有点陌生,我们之前已经学过进程了,简单点说,进程就是执行中的程序,为什么会有线程的概念呢?因为一个进程在同一时刻只能做一件事情,有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻能够不止做一件事,每个线程处理各自独立的任务,这种方法有很多好处。下面就是线程的概念。


线程的概念:


线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列: main

的执行体。进程可以通过线程库创建 N条线程,这些新创建的线程称之为函数线程,

main函数所代表的线程为主线程


线程与进程的区别:

1进程是资源分配的最小单位,线程是 CPU调度的最小单位

2线程是轻量级的进程

3管理方式不同,进程是 PCB管理,线程是由线程结构管理。


线程实现的三种方式

1、 用户级



2、 内核级


 3、 混合模式


线程的创建:(线程库文件的使用) pthread

int pthread_create(pthread_t *id,pthread_attr_t *attr,void* (*fun)(void*), void *arg);






包含线程创建函数的源代码要想生成可执行文件,必须::

gcc -o pthread pthread.c –lpthread

 

创建出来的函数线程不同于函数调用,函数调用是这条执行流中的一部分。函数线

程是创建出一条独立的执行序列,他与主线程同时执行。

线程结束: int pthread_exit(void *);参数可以设置线程结束状态

等待线程结束: int pthread_join(pthread_t id, void **);

可以获取到等待的线程通过 pthread_exit设置的结束状态信息

 

线程函数传参:

1将值强转成 void*

int a = (int) arg;

2将地址强转成 void*

int a = *(int*)arg;

下面写一个例子:创建函数线程, 主线程完成对数组元素的排序, 函数线程完成打印100以内所
有的素数。

源代码:

#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <pthread.h>#include <stdbool.h>#include <string.h>#include <fcntl.h>#include <unistd.h>bool IsPrimer(int n){int i;for(i = 2;i < n;i ++){if(n%i == 0){return false;}}return true;}void *pthread_fun(void *arg){printf("\nBubbleSort pid = %d\n",getpid());int i;for(i = 2;i < 50;i ++){if(IsPrimer(i)){printf("%d is primer\n",i);}}pthread_exit("end");}void BubbleSort(int arr[],int len){int tmp;int i;for(i = 0;i < len - 1;i ++){int j;for(j = 0;j < len - 1 - i;j ++){if(arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}void main(){pthread_t id;int res = pthread_create(&id, NULL, pthread_fun, NULL);assert(res == 0);printf("main pid = %d\n",getpid());int arr[] = {13,56,3,4,6,7,8};int len = sizeof(arr)/sizeof(arr[0]);BubbleSort(arr,len);int i;for(i = 0;i < len; i++){printf("%d  ",arr[i]);}char *p = NULL;pthread_join(id,&p);}

运行结果: