线程的概念
线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main 执行体。
进程可以通过线程创建 N 条线程,这些新创建的线程称之为函数线程,main 函数所代表的线程为主线程。
线程与进程的区别
1. 进程是资源分配的最小单位,线程是 CPU 调度的最小单位
2. 线程是轻量级的进程
3. 管理方式不同,进程是 PCB 管理,线程是由线程结构管理
线程的三种实现方式
1. 用户级(n : 1)
2. 内核级(n : n)
3. 混合模式(n : m)
线程的相关操作
线程的创建:(线程库文件的使用)pthread
int pthread_create(pyhread_t *id, pthread_attr_t *attr, void *(*fun)(void *), void *arg);
利用这个函数创建一个函数线程
包含线程创建函数的源代码想要生成可执行文件,链接时必须:
gcc -o pthread pyhread.c -lpyhread
创建出来的函数线程不同于函数调用,函数调用是这条执行流中的一部分。
函数线程是创出一条独立的执行序列,它与主线程同时执行。
线程结束: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 <unistd.h>
#include <string.h>
#include <assert.h>
#include <pthread.h>
void BubbleSort(int *arr, int len)
{
int tmp;
for (int i=0; i<len; i++)
{
for (int j=i+1; j<len-1-i; j++)
{
if (arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
printf("\n");
}
void *pthread_fun(void *arg)
{
int i;
int j;
for (i=2; i<=100; i++)
{
for (j=i-1; j>=2; j--)
{
if (i%j == 0)
{
break;
}
}
}
printf("\n");
pthread_exit("hello world\n");
}
void main()
{
int arr[10] = {1,3,5,3,4,9,96,4,78,56};
pthread_t id;
int res = pthread_create(&id, NULL, pthread_fun, NULL);
BubbleSort(arr, 10);
void *buffer = NULL;
pthread_join(id, &buffer);
printf("%s\n", (char *)buffer);
pthread_exit(NULL);
}
测试运行结果如下: