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中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...
随机推荐
- HDU 5293
树上DP题. 其实有点类似于01的问题.方程很容易想到.首先,因为一条链的节点其实都是在树上的,所以很容易想到应该先求一个LCA.然后,当某节点不是链的LCA时,它的转移就是: dp[i]=sum[i ...
- 题目3 : Spring Outing 微软2016校园招聘在线笔试第二场
题目3 : Spring Outing 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 You class are planning for a spring outin ...
- HDU 4532
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- 2.6-NAT
2.6-NAT 网络地址转换协议NAT(Network Address Translation): 交换和远程都要用,先上什么就放在哪一块讲,具体来说NAT还是属于远程的. ...
- Mahout算法调用展示平台2.1
软件版本号: windows7: Tomcat7.JDK7.Spring4.0.2.Struts2.3.Hibernate4.3.myeclipse10.0.easyui:Linux(centos6. ...
- RMAN 备份与恢复 实例
1. 检查数据库模式: sqlplus /nolog conn /as sysdba archive log list (查看数据库是否处于归档模式中) 若为非归档,则修改数据库归 ...
- [NOI2018]归程(80pts)
https://www.zybuluo.com/ysner/note/1219964 题面 题面太长,难以概述,[戳我][1] \(ex10pts\ tree\) \(50pts\ n\leq1500 ...
- A simple problem(并查集判环)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497 题意:给定一些点和边的关系,判断S点是否 ...
- curl强制下载文件
<?phpfunction download_remote_file_with_curl($file_url, $save_to) { $ch = curl_init(); curl_setop ...
- HTML多媒体标记之字幕标记
在HTML中,可以向页面中插入字幕,水平或垂直滚动显示文字信息,字幕标记的格式如下: <marquee 属性="值"...>滚动的文字信息</marquee> ...