UDP、线程、mutex锁(day15)
一、基于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)的更多相关文章
- Java线程与锁
概要:线程的实现方法. 线程调度.线程状态及转换.线程安全(5种分类.3种实现方法.锁优化技术) 进程是OS进行资源分配的基本单位,线程是CPU调度的基本单位. 1.线程的实现方法 可参阅 我是一个进 ...
- Python的并发并行[1] -> 线程[2] -> 锁与信号量
锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...
- Python 35 线程(2)线程特性、守护线程、线程互斥锁
一:线程特性介绍 from threading import Thread import time n=100 def task(): global n n=0 if __name__ == '__m ...
- 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程
进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...
- python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
9.94 守护线程与守护进程的区别 1.对主进程来说,运行完毕指的是主进程代码运行完毕2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕详细解释:1.主 ...
- python线程互斥锁Lock(29)
在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...
- python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- JAVA语言规范-线程和锁章节之同步、等待和通知
JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...
随机推荐
- Android LaunchAnyWhere (Google Bug 7699048)漏洞具体解释及防御措施
開始 近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048). 这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,能够突破了应用间 ...
- HotSpotVM 线程实现浅析
今天来看下HotSpotVM在Linux下的线程模型. Thread.start HotSpot Runtime Overview 中说道, There are two basic ways for ...
- nyoj860 又见01背包(背包变形)
题目860 pid=860" style="text-decoration:none; color:rgb(55,119,188)">题目信息 执行结果 本题排行 ...
- 1366 xth 的第 12 枚硬币
1366 xth 的第 12 枚硬币 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 传说 xth 曾 ...
- jQery总结01
1 jQuery 的基本语法结构是什么? 2 $(document).ready() 与 window.onload 有什么区别? 3 如何实现 DOM 对象和 jQuery对象间的转化?
- 【JLOI 2014】 松鼠的新家
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3631 [算法] 树上差分 [代码] #include<bits/stdc++. ...
- 【POJ 2248】 Addition Chain
[题目链接] http://poj.org/problem?id=2248 [算法] 搜索剪枝 剪枝1 : 优化搜索顺序,从大到小枚举 剪枝2 : Ai + Aj可能相等,只需搜一次即可 剪枝3 : ...
- K-means algorithm----PRML读书笔记
The K-means algorithm is based on the use of squared Euclidean distance as the measure of dissimila ...
- Greenplum使用教程
Greenplum简介 GreenPlum是一个关系型数据库集群.,它实际上是由多个独立的数据库服务组合成的逻辑数据库.GreenPlum是基于PostgreSQL(开源数据库)的分布式数据库,它采用 ...
- # secure_link_module模块
作用 制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问 限制链接生效周期 首先检查nginx是否已安装模块 #nginx -V 输出nginx所有已安装模块,检查是否有ngx_http_ ...