【网络编程基础(二)】POSIX多线程技术

1、线程的概念

在一个程序里的多个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
一切进程至少都有一个执行线程

进程是资源分配的基本单位,线程是cpu调度的基本单位

2、CPU性能和效能

  • 性能核心(P-CORE) 大核心/超大核心
  • 效能核心 (E-CORE)小核心
  • 大核心:随机轮片,执行的时间和顺序的随机
  • 小核心:顺序执行,消耗的资源更少

在还没有超线程技术之前,单核心单位时间只允许一个线程。随机轮片(时间片轮片)技术,它保证了每个进程都能获得一定的CPU执行时间,并且能够及时响应用户的操作。当一个进程的时间片用完后,它会被放到队列的末尾,等待下一次调度,这样可以确保每个进程都有机会执行。
1秒 =1000毫秒

超线程技术:单核心多线程运行

3、并发和并行

  • 并发:用户级进程(同时发生不同时进行)
  • 并行:内核级进程(同时发生同时进行)

4、线程的优缺点

4.1、线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作至少在理论上要少很多
  • 线程占用的资源要比进程少很多

4.2、线程的缺点

  • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的
  • 调试一个多线程程序也比调试一个单线程程序困难得多

5、fork和创建新线程的区别

当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID。这个新进程的运行时间是独立的,它在执行时几乎完全独立于创建它的进程
在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但要与它的创建者共享全局变量、文件描述符、信号处理器和当前的子目录状态

6、线程函数库

  • 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
  • 要使用这些函数库,要通过引入头文件<pthread.h>
  • 链接这些线程函数库时要使用编译器命令的“-pthread”选项

跨平台开发,使用线程时需要在工程(例如VS工程名右键)属性页的链接器的命令行添加-pthread

在这里插入图片描述
在这里插入图片描述

7、线程标识符

  • 像每个进程有一个进程ID一样,每个线程也有一个线程ID
  • 进程ID在整个系统中是唯一的,但线程不同,线程ID只在它所属的进程环境中有效
  • 线程ID用pthread_t数据类型来表示,实现的时候可以用一个结构来代表pthread_t数据类型,所以可以移植的操作系统不能把它作为整数处理

8、pthread_create函数

在这里插入图片描述
在这里插入图片描述

8.1、创建线程示例

#include <iostream>
#include <stdio.h>
#include <pthread.h> 
#include <unistd.h>

using namespace std;

void* thread_function(void* arg)
{
	while (1)
	{
		cout << "child thread run" << endl;
		sleep(1);
	}
}
int main()
{
	pthread_t threadid;
	if (pthread_create(&threadid, NULL, thread_function, NULL) != 0)
	{
		perror("pthread_create error");
	}
	while (1)
	{
		cout << "main thread run" << endl;
		sleep(1);
	}
	return 0;
}

8.2、创建线程示例(传参)

#include <iostream>
#include <stdio.h>
#include <pthread.h> 
#include <unistd.h>

using namespace std;

void* thread_function1(void* arg)
{
	int x=*(int *)arg;
	while (1)
	{
		x++;
		cout << "child1 thread run x = " <<x<<endl;
		sleep(1);
	}
}
void* thread_function2(void* arg)
{
	int y=*(int *)arg;
	while (1)
	{
		cout << "child2 thread run  y= "<<y << endl;
		sleep(1);
	}
}
int main()
{
	int number=0;
	pthread_t threadid;
	if (pthread_create(&threadid, NULL, thread_function1, &number) != 0)
	{
		perror("pthread_create error");
	}
	if (pthread_create(&threadid, NULL, thread_function2, &number) != 0)
	{
		perror("pthread_create error");
	}
	while (1)
	{
		cout << "main thread run    number = " <<number<< endl;
		sleep(1);
	}
	return 0;
}
  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 滑动窗口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06socket编程(一) 什么是socket IPv4套接口地址结构 网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程() TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九) select 读、写、异常事件发生条件 用select改进回射服务器程序。 15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 23进程间通信介绍(一) 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对象的持续性 24进程间通信介绍() 死锁 信号量 PV原语 用PV原语解决司机与售票员问题 用PV原语解决民航售票问题 用PV原语解决汽车租赁问题 25System V消息队列(一) 消息队列 IPC对象数据结构 消息队列结构 消息队列在内核中的表示 消息队列函数 26System V消息队列() msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列与共享内存传递数据对比 mmap函数 munmap函数 msync函数 29System V共享内存 共享内存数据结构 共享内存函数 共享内存示例 30System V信号量(一) 信号量 信号量集结构 信号量集函数 信号量示例 31System V信号量() 用信号量实现进程互斥示例 32System V信号量(三) 用信号集解决哲学家就餐问题 33System V共享内存与信号量综合 用信号量解决生产者消费者问题 实现shmfifo 34POSIX消息队列 POSIX消息队列相关函数 POSIX消息队列示例 35POSIX共享内存 POSIX共享内存相关函数 POSIX共享内存示例 Linux网络编程之线程篇 36线程介绍 什么是线程 进程与线程 线程优缺点 线程模型 N:1用户线程模型 1:1核心线程模型 N:M混合线程模型 37POSIX线程(一) POSIX线程库相关函数 用线程实现回射客户/服务器 38POSIX线程() 线程属性 线程特定数据 39POSIX信号量与互斥锁 POSIX信号量相关函数 POSIX互斥锁相关函数 生产者消费者问题 自旋锁与读写锁介绍 40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值