一、基于UDP的网络编程模型
服务器端
、创建socket.
、将fd和服务器的ip地址和端口号绑定
、recvfrom阻塞等待接收客户端数据
、业务处理
、响应客户端 客户端:
、创建socket
、向服务器发送数据sendto
、阻塞等待服务器的响应信息
、处理响应信息
、断开通讯 #include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,void *buf,size_t len,\
int flags,
struct sockaddr *src_addr,\
socklen_t *addrlen);
功能:从一个socket上接收消息
参数:
sockfd:指定socket。socket()的返回值
buf:存放消息的缓冲区地址
len:指定buf的最大尺寸
flags:
src_addr:存放的是对面的地址
addrlen:是一个值-结果参数。src_addr的长度
返回值:
成功 返回接收到的字节数
- 错误 errno被设置
对面down机 #include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr,\
socklen_t addrlen); 功能:在socket上发送消息
参数:
sockfd:指定socket
buf:存放数据的缓冲区首地址
len:buf中有效的字节数
flags:
dest_addr:目标地址
addrlen:目标地址的长度
返回值:
- 错误 errno被设置
成功 返回发送出去的字节数。 编写代码实现基于udp的网络通讯。
代码参见:
userv.c uclie.c 172.30.3.93 网络通讯 二、线程的基础
线程 执行的基本单位,线程共享进程的资源
进程 进程是资源分配的基本单位 每个线程有自己的tid。thread_id
每个线程有自己私有的栈帧。 三、线程的创建
系统提供了函数pthread_create()用于创建线程
#include <pthread.h>
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),\
void *arg);
功能:创建一个新的线程
参数:
thread:存放线程id的缓冲区。
attr:NULL 缺省属性
start_routine:线程的执行函数
arg:start_routine函数的唯一参数。
返回值:
成功
错误 错误码 Compile and link with -pthread.
void *(*start_routine) (void *) 举例说明 创建新的线程
代码参见 pthread_c.c getpid()获取进程的pid。
pthread_self()来获取线程自己的tid。
#include <pthread.h>
pthread_t pthread_self(void);
功能:获取当前线程的id
参数:
void
返回值:
返回线程的id。 四、线程退出、汇合、分离
线程的退出
、return和exit()的区别
return只是函数的返回,在线程处理函数中,只是代表了线程的结束。而exit()代表的是进程的结束。进程中的所有线程就终止了。 、使用函数pthread_exit()来终止一个线程
#include <pthread.h>
void pthread_exit(void *retval);
功能:终止当前线程
参数:
retval:指定传递给另一个线程的值,那个线程调用pthread_join()接收这个值。 返回值:
不返回给调用者。
、pthread_cancel()
#include <pthread.h>
int pthread_cancel(pthread_t thread);
功能:给线程发送取消请求
参数:
thread:指定了接收请求的线程id。 返回值:
成功
非0 错误码 注意:使用pthread_cancel终止的进程,在使用pthread_join()获取线程退出信息的时候,获取到的是PTHREAD_CANCELED。 线程的汇合
pthread_join()等待线程的汇合
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:汇合一个终止的线程
参数:
thread:指定了等待汇合的线程的id
retval:
返回值:
成功
失败 返回错误码 举例说明 线程的退出和汇合
代码参见pthread_e.c 线程的分离
pthread_detach()
#include <pthread.h>
int pthread_detach(pthread_t thread);
功能:分离一个线程
参数:
thread:指定要分离的线程
返回值:
成功
非0 错误码 举例说明 线程的分离
代码参见 pthread_d.c 新建的线程和进程中已经存在的线程是异步的。
这些线程会对公共资源形成竞争。怎么解决竞争?
、可重入函数
、让异步的线程同步的访问共享资源。 五、线程同步
条件变量 mutex锁 信号量
举例说明 多个线程异步访问共享资源(临界资源)
代码参见 count.c 使用mutex锁解决临界资源的问题
什么是mutex锁?
pthread_mutex_t 是一个类型 mutex锁类型 mutex所是一个互斥设备。
一个mutex锁类型的变量有两中状态
unlocked:不被任何线程拥有
locked:被一个线程拥有 一个mutex锁从来不能被两个线程同时拥有。
如果一个线程想拥有的mutex锁,被另外的线程占用。那么这个线程挂起执行,直到另外线程放弃才能得到。 对临界资源的访问要遵守三歩:
、先获取mutex锁
、访问临界资源
、释放mutex锁 phtread_mutex_init()
#include <pthread.h> 静态初始化一个mutex锁
pthread_mutex_t fastmutex=PTHREAD_MUTEX_INITIALIZER; int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
功能:初始化一个mutex锁
参数:
mutex:指定要初始化的mutex锁
mutexattr:NULL 默认
返回值: int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:获取mutex锁,如果这个锁不被其他线程占有,立即返回,拥有了这把锁。将锁的状态改变为locked。
这把锁被其他线程占有。挂起线程,直到其他线程解锁为止。
参数:
mutex:指定了要获取的mutex锁
返回值:
非0 错误
成功 int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:获取mutex锁,在其他线程占有这个mutex锁的时候,非阻塞。立即返回,错误。EBUSY
参数:
mutex:指定要获取的mutex锁
返回值:
非0 错误
成功
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:解锁mutex
参数:
mutex:释放mutex锁
返回值:
非0 错误
成功
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:销毁mutex锁
参数:
mutex:指定要销毁的mutex锁
返回值:
非0 错误
成功 改进count.c。使用mutex锁让进程同步访问临界资源。
总结:
一、基于UDP的编程模型
二、线程的基础
三、线程的创建
四、线程的退出、汇合、分离
五、线程同步 mutex锁

UDP、线程、mutex锁(day15)的更多相关文章

  1. Java线程与锁

    概要:线程的实现方法. 线程调度.线程状态及转换.线程安全(5种分类.3种实现方法.锁优化技术) 进程是OS进行资源分配的基本单位,线程是CPU调度的基本单位. 1.线程的实现方法 可参阅 我是一个进 ...

  2. Python的并发并行[1] -> 线程[2] -> 锁与信号量

    锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...

  3. Python 35 线程(2)线程特性、守护线程、线程互斥锁

    一:线程特性介绍 from threading import Thread import time n=100 def task(): global n n=0 if __name__ == '__m ...

  4. 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程

    进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...

  5. python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)

    9.94 守护线程与守护进程的区别 1.对主进程来说,运行完毕指的是主进程代码运行完毕2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕​详细解释:1.主 ...

  6. python线程互斥锁Lock(29)

    在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...

  7. python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02

    目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...

  8. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  9. JAVA语言规范-线程和锁章节之同步、等待和通知

    JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...

随机推荐

  1. 输入法InputConnection

    /**  * The InputConnection interface is the communication channel from an  * {@link InputMethod} bac ...

  2. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

  3. SpringMVC案例2----基于spring2.5的注解实现

    和上一篇一样,首先看一下项目结构和jar包 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fo ...

  4. C# textbox中输入时加限制条件 // C#Winform下限制TextBox只能输入数字 // 才疏学浅(TextBox 小数点不能在首位+只能输入数字)

    textbox中输入时加限制条件 分类: C# winform2008-08-26 08:30 306人阅读 评论(0) 收藏 举报 textbox正则表达式object 1.用正则表达式! 2.使用 ...

  5. 针对深度学习(神经网络)的AI框架调研

    针对深度学习(神经网络)的AI框架调研 在我们的AI安全引擎中未来会使用深度学习(神经网络),后续将引入AI芯片,因此重点看了下业界AI芯片厂商和对应芯片的AI框架,包括Intel(MKL CPU). ...

  6. awk 去重的同时并保持原来的顺序

    #-----------awk.awk------------ {    if(data[$0]++ == 0)        lines[++count] = $0} END {    for (i ...

  7. mysql重设root的密码 mac

    创建: 2017/09/14    第一步: 关闭已开启的mysql服务器  mysql.server stop  第二步: 关闭密码识别模式   /usr/local/bin/mysqld_safe ...

  8. 常用的 Maven 命令

    maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下. -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试: -P 指定 ...

  9. 树莓派-USB存储设备自动挂载

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  10. Android_传感器光学

    上一篇写了一个小案例方向传感器,与这光学传感器原理大致类似,但其实代码的主要区别得到的类型不一样在这里我一一列举出来: * Sensor.TYPE_ORIENTATION:方向传感器. * Senso ...