linux网络编程学习笔记之四 -----多-threaded服务器
对于使用过程中并发。通过实现更轻量级线程。
每个线程都是一个独立的逻辑流。
主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元。当然,这是在微内核操作系统说。总之,这是唯一的一个操作系统内核提供了最重要的OS服务,许多人看点击打开链接
每一个线程有它自己的线程上下文。包含一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针。程序计数器、通用目的寄存器和条件码,还有自己的信号掩码和优先级。同一个进程里的线程共享这个进程的整个虚拟地址空间,包含可运行的程序文本、程序的全局内存、堆内存、栈和文件描写叙述符。因此,线程的上下文切换比进程迅速得多,但同一时候也带来了线程之间的同步问题。
几个小Tips:
1、进程ID在整个系统中是唯一的,但线程ID仅仅在它所属的线程环境里有效。
2、每一个线程都有errno的副本,不用考虑其同步问题。
3、随意一个线程调用了exit, _Exit, _exit都会造成整个进程的终止。
4、因为描写叙述字的共享性,新创建线程并不影响已打开描写叙述字的引用计数。因此,不要随便close。
线程的几个属性
分离和可结合:假设一个线程能被其它线程收回其资源和杀死,它就是可结合的,否则就是分离的。默认情况下。线程被创建出来是可结合的。这时须要某个原有的线程调用pthread_join()来堵塞等待该进程结束并回收其资源(因为此函数仅仅能等待一个特定线程会导致编码复杂,Steven在UNP中可爱地吐槽了一段,当年与标准设计人员吵了一架)。
而分离的线程无需其它线程等待,一旦结束。资源马上被操作系统回收,在其创建是调用pthread_detach()就可以实现。
很多其它的属性如继承性。调度策略,调度 ,作用域和堆栈大小等能够參看APUE12.3
对于属性变量pthread_attr_t能够调用pthread_attr_init设置,但要记得在创建线程后用pthread_attr_destory销毁
进程同步常见方法
1)相互排斥锁UNP26.7
2)条件变量UNP26.8。须要注意的是pthread_cond_wait()假设没有信号。线程会堵塞直到有信号。但相互排斥量会马上释放。反之,它返回时,相互排斥量再次被锁住。
3)信号量CSAPP12.5
上面仅仅是简单地罗列和笔记。线程水太深。我将继续学习。
。
惯例。上个简单的server端程序:
#include"simon_socket.h" #define SERV_PORT 12345 typedef struct arg_tag
{
int connectfd;
struct sockaddr_in addr_info;
}ARG; void *start_routine(void *arg)
{
pthread_detach(pthread_self()); process_client(((ARG*)arg) -> connectfd, &((ARG*)arg) -> addr_info);
close(((ARG *)arg) -> connectfd); //free(arg);
pthread_exit(NULL);
} int main()
{
int sockfd, acfd;
size_t sin_len = sizeof(struct sockaddr);
ARG *arg; struct sockaddr_in client_addr; pthread_t thread; sockfd = init_tcp_psock(SERV_PORT); while (1)
{
if ((acfd = accept_request(sockfd, (struct sockaddr *)&client_addr, &sin_len)) <= 0)
continue; arg = malloc(sizeof(ARG));
arg -> connectfd = acfd;
arg -> addr_info = client_addr; if (pthread_create(&thread, NULL, start_routine, (void*)arg))
{
printf("Create thread error!\n");
continue;
}
free(arg);
}
close(sockfd);
return 0;
}
代码中一些调用函数的实现。移步我的github:https://github.com/simon-xia/lnp
版权声明:本文博客原创文章。博客,未经同意,不得转载。
linux网络编程学习笔记之四 -----多-threaded服务器的更多相关文章
- linux网络编程学习笔记之五 -----并发机制与线程�
进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)
errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1.并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen(). e ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- Linux网络编程学习计划
由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章 概论 P1-16 第二章 UNIX ...
- 【Visual C++】游戏编程学习笔记之四:透明动画实现
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- Linux C网络编程学习笔记
Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...
随机推荐
- 电商指尖---(6)solrconfig.xml配置具体解释
solrconfig.xml配置文件主要定义SOLR理规则,包含索引数据的存放位置,更新,删除,查询的一些规则配置. 能够在tomcat的安装路径下找到这个文件C:\Program Files\Apa ...
- POJ 2756 Autumn is a Genius 采用string大数减法
标题意味着小神童.加减可以计算. 只是说这个小神童的学科知识,究竟有多神,自己给自己找. 最后,因为数据是非常非常巨大的,我听说关闭50k结束了50000数字总和,可以想见他神教. 这似乎也是考试题目 ...
- 64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误
在WIN7 64位下用Microsoft.Jet.OLEDB.4.0方法访问数据库Access,出现未注册错误 如果是要建立64位的应用程序 1.Microsoft Access Database E ...
- 看你的门-攻击服务器(4)-HTTP参数注入攻击
首先需要声明.这纯粹是没有远见和有点真才实学开发一个愚蠢的观点,只为web参考系统安全. 1.HTTP参数注入攻击 參数,被用做后端HTTP请求中的參数,这个时候就有可能会导致HTTP參数注入. 一个 ...
- Error opening zip file or JAR manifest missing : D:\play-1.2.5/framework/play-1.2.5.jar
play框架写的项目,在eclipse中导入.build-path中全部jar包都加入.执行程序,出现: Error occurred during initialization of VM agen ...
- unity3d 学习笔记(两)
AudioClip 使用声音资源 unity3d资源可以被设置为声3d声音或2d声音.3d间的影响,越近声音越大 component: Audio source: 声音的发生物体 Audio list ...
- Android:创建耐磨应用 - 定义自己的布局
创建自己的自定义布局(Creating Custom Layouts) 本文介绍如何创建自己的自定义通知和使用可穿戴UI库来创建自己的自定义布局同时你还需要知道耐磨设计标准(Wear Design P ...
- Web Design 再生:UX Design
高质量的Web 模板,成熟的Design Pattern,人工智能的引用,移动技术的冲击是否标志着Web Design 结束的时代已经到来? Web Design 最终也未避免与“死亡”这个词的关联, ...
- 无插件,直接加参数,chrome它可以模拟手机浏览器
在目标出现,加上一些参数即可:--user-agent="mozilla/5.0 (linux; u; android 2.3.3; en-us; sdk build/ gri34) app ...
- InstallShield自定义安装界面
原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...