在大家的关注与陪伴下,前些日子我们已将网络通信基础专栏更新完毕,包括网络编程基础中所有函数的工作原理以及使用方法,感兴趣的同学欢迎查看.从今天开始,我们一起正式进入linux系统下多线程多进程的学习.
想象一下,如果你需要构建一个火车站售票系统,在面对巨大的人流量时,能够高效、快速地处理所有的购票请求。我们可能的思路是构建一个售票函数,并在主函数调用他.这相当于仅仅创建了一个售票窗口,无法满足高效、快速的性能.如果可以设置多个售票窗口同时运行,这效率不久可以嘎嘎提高了吗.这就是线程的作用,每个线程相当于一个售票系统.
线程是程序中负责执行的实体,或者说是进程的子任务。线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少要有一个线程,即主线程,也可以有多个线程,即创建子线程。线程可以看作是轻量级的进程,除了栈之外,没有自己独立的内核资源。
要使用线程,需要包含头文件:
#include<pthread.h>
线程的函数定义:
?
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
其中:
thread:线程标识符指针;
attr:线程属性指针,如堆栈大小、是否分离等,通常设为NULL,表示默认属性;
start_routine:线程运行函数的起始地址,
注意函数的类型:void *(*start_routine) (void *);
arg:传递给线程函数的参数,可传入NULL(ps:这个参数是void类型的,一般需要使用void *将参数强制转换)
2.举例
// 引入所需的头文件,这些文件提供了多线程编程所需的各种功能和数据类型
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
// 定义第一个线程的执行函数
void *pth1(void* str) {
std::cout << "第一个线程" << std::endl;
pthread_exit(0); // 退出当前线程,并返回一个值(在这种情况下为0)
}
// 定义第二个线程的执行函数
void *pth2(void* str) {
std::cout << "第二个线程" << std::endl;
pthread_exit(0); // 退出当前线程,并返回一个值(在这种情况下为0)
}
// 主函数
int main(void) {
// 定义两个线程的标识符
pthread_t thread1, thread2;
// 创建第一个线程,并执行 pth1 函数
pthread_create(&thread1, NULL, pth1, NULL);
// 创建第二个线程,并执行 pth2 函数
pthread_create(&thread2, NULL, pth2, NULL);
// 等待第一个线程结束(如果它还在运行的话)
pthread_join(thread1, NULL);
// 当第一个线程退出后,输出“第一个线程退出”
std::cout << "第一个线程退出" << std::endl;
// 等待第二个线程结束(如果它还在运行的话)
pthread_join(thread2, NULL);
// 当第二个线程退出后,输出“第二个线程退出”
std::cout << "第二个线程退出" << std::endl;
std::cout << "主函数退出" << std::endl;
}
这个例子中有很多还没有讲到的函数,大家不用慌,后续都会讲到,这篇文章仅需要你知道如何创建线程即可.