招标网站平台有哪些,深圳网站推广公司,太极seo,黄页推广软件哪个好在大家的关注与陪伴下,前些日子我们已将网络通信基础专栏更新完毕,包括网络编程基础中所有函数的工作原理以及使用方法,感兴趣的同学欢迎查看.从今天开始,我们一起正式进入linux系统下多线程多进程的学习.
0.为什么要使用线程
想象一下#xff0c;如果你需要构建一个火车站售…在大家的关注与陪伴下,前些日子我们已将网络通信基础专栏更新完毕,包括网络编程基础中所有函数的工作原理以及使用方法,感兴趣的同学欢迎查看.从今天开始,我们一起正式进入linux系统下多线程多进程的学习.
0.为什么要使用线程
想象一下如果你需要构建一个火车站售票系统在面对巨大的人流量时能够高效、快速地处理所有的购票请求。我们可能的思路是构建一个售票函数,并在主函数调用他.这相当于仅仅创建了一个售票窗口,无法满足高效、快速的性能.如果可以设置多个售票窗口同时运行,这效率不久可以嘎嘎提高了吗.这就是线程的作用,每个线程相当于一个售票系统.
1.线程的定义
线程是程序中负责执行的实体或者说是进程的子任务。线程是操作系统能够进行运算调度的最小单位被包含在进程之中是进程中的实际运作单位。一个进程至少要有一个线程即主线程也可以有多个线程即创建子线程。线程可以看作是轻量级的进程除了栈之外没有自己独立的内核资源。
要使用线程,需要包含头文件:
#includepthread.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;
}
这个例子中有很多还没有讲到的函数,大家不用慌,后续都会讲到,这篇文章仅需要你知道如何创建线程即可.