UNIX网络编程----线程(二十六)

UNIX网络编程----线程

一、概述

一个服务器的父进程accept一个连接,fork()一个子进程,该子进程处理与该连接对端的客户之间的通信。但是fork调用却存在一些问题。

1)  fork是昂贵的。当今的实现使用称为写实复制的技术,用以避免在子进程切实需要自己的副本之前把父进程的数据空间按复制到子进程。然而即便有这样的优化措施,fork还是昂贵的。

2)  fork返回之后斧子进程之间信息的传递需要进程间通信(IPC)机制,从父进程向子进程传递信息比较容易,但是相反的方向却不是那么容易。

线程有助于解决这两个问题,线程创建可能比进程的创建块10~100倍。

同一进程的所有线程共享相同的全局内存。这使得线程之间易于共享信息,然而伴随这种简易行而来的是同步问题

同一进程内的所有线程除了共享全局变量之外还共享:

1)  进程指令

2)  大多数数据

3)  打开的文件(即描述符)

4)  信号处理函数和信号处置

5)  当前工作目录

6)  用户ID和组ID

每个线程有各自的:

1)  线程ID

2)  寄存器集合,包括程序计数器和栈指针

3)  栈(用于存放局部变量和返回地址)

4)  Errno

5)  信号掩码

6)  优先级

二、基本线程函数:创建和终止

1)#include <pthread.h>

Int pthread_create(pthread_t*tid,const pthread_attr_t *attr,void *(*func(void*)),void *arg);

创建一个线程时我们最后指定的参数是由该线程执行的函数及其参数。该线程通过调用这个函数开始执行,然后或者显示地终止(通过调用pthread_exit),或者隐式地终止(通过让函数返回)。该函数的地址由func参数指定,该函数的唯一调用参数是指针arg。如果我们需要给该函数传递多个参数,我们就得把他们打包成一个结构,然后把这个结构的地址作为单个参数传递给这个其实函数。

注意func和arg的声明。Func所指函数作为参数接受一个通用指针(void *),又作为返回值返回一个通用指针(void *).这使得我们可以把一个指针(它指向我们期望的任何     内容)传递给线程,又允许线程返回一个指针(它同样指向我们期望的任何内容)

返回成功为0,失败为非0.

2)#include <pthread.h>

   Int pthread_join(pthread_t*tid,void **status);

  我们可以通过这个函数等待一个给定线程终止,对比与UNIX进程,pthread_create类似于fork,pthread_join类似于waitpid.

必须知道你个要等待线程的tid,如果status指针为非空,来自所等待线程的返回值(一个指向某个对象的指针)将存入有status指向的位置。

3)  pthread_t pthread_self(void);

获取自身的线程ID。类似于进程中的getpid函数。

4)  pthread_detach函数

一个线程可能是可回合的,或者是可脱离的。当一个可汇合的线程终止时,它的线程ID和退出状态将留存待另一个线程对它调用pthread_join。此函数把指定的线程转变为脱离状态。

三、互斥锁

线程编程为并发编程或者并行编程,因为多个线程可以并发地运行且访问相同的变量。进程编程中不会发生这样的情况,但讨论在进程之间的共享内存区时,仍然会碰到同类问题。解决这个问题的方法为互斥锁。使用互斥锁来保护这个共享变量。访问该变量的前条件是持有该互斥锁。互斥锁是类型为pthread_mutex_t的变量。

1)#include <pthread.h>

   Int pthread_mutex_lock(pthreaed_mutex_t*mptr);

   Int pthread_mutex_unlock(pthread_mutex_t*mptr);

如果试图上锁已被另外某个线程锁住的一个互斥锁,本线程将被阻塞,直到该互斥锁被解锁为止。

如果某个互斥锁变量时静态分配的,我们就必须把它初始化为常值PTHREAD_MUTEX_INITIALIZER.如果我们在共享内存区分配一个互斥锁,那么必须通过调用pthread_mutex_init函数在运行时把它初始化。

四、条件变量

互斥锁适合于防止同时访问某个共享变量,但是我们需要另外某种在等待某个条件发生期间能让我们进入睡眠的东西。

需要一个让主循环进入睡眠,直到某个线程通知它有事可做才醒来的方法。条件变量结合互斥锁能够提供这个功能。互斥锁提供呼哧机制,条件变量提供信号机制。条件变量时类型为pthread_cond_t的变量。

Int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t*mptr);

Int pthread_cond_signal(pthread_cond_t *cptr);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程线程篇 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信号量(一) 信

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值