对于使用过程中并发。通过实现更轻量级线程。

每个线程都是一个独立的逻辑流。

主题是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服务器的更多相关文章

  1. linux网络编程学习笔记之五 -----并发机制与线程�

    进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...

  2. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

  3. linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

    errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1.并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen(). e ...

  4. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  5. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  6. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  7. Linux网络编程学习计划

    由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章   概论   P1-16 第二章   UNIX ...

  8. 【Visual C++】游戏编程学习笔记之四:透明动画实现

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...

  9. Linux C网络编程学习笔记

    Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...

随机推荐

  1. Oracle性能分析3:TKPROF简介

    tkprof它是Oracle它配备了一个命令直插式工具,其主要作用是将原始跟踪文件格文本文件的类型,例如,最简单的方法,使用下面的: tkprof ly_ora_128636.trc ly_ora_1 ...

  2. BZOJ 1096 ZJOI2007 仓库建设 边坡优化

    标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...

  3. extjs_09_定义自己的页面组件

    1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...

  4. iOS UITableViewCell AccessoryType属性

    写了这么长时间的ios table 竟然不知道有一个Accessory来显示详情设置小图标,曾经竟然傻帽的取用一张图片来显示,如今想想真是..那痛啊.... cell.accessoryType = ...

  5. python 3.4.0 简单的print &#39;hello world&#39;,出错--SyntaxError: invalid syntax

    问题描写叙述: win7下安装的python 3.4.0版本号, 在命令行里写入简单的输出语句: print 'hello world' 然后enter,结果返回结果为: SyntaxError: i ...

  6. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...

  7. 我的2011年总结--大明zeroson程序猿一周年总结

    花絮:看到csdn举办"我的2011"年度征文活动,我恰好工作也一年多了,上个月写了篇博客,主要是我换工作方面的流水账,这篇我从主观.客观.多方位地谈谈我这一年的变化.       ...

  8. Json.Net6.0入门学习试水篇

    原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...

  9. POJ 2411 Mondriaan&#39;s Dream (dp + 减少国家)

    链接:http://poj.org/problem?id=2411 题意:题目描写叙述:用1*2 的矩形通过组合拼成大矩形.求拼成指定的大矩形有几种拼法. 參考博客:http://blog.csdn. ...

  10. Android重力加速度传感器数据去噪

    public void onSensorChanged(SensorEvent event) { final float alpha = 0.8; gravity[0] = alpha * gravi ...