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

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

主题是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. Nancy 框架

    Nancy 框架 Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE ,  GET ,  HEAD ,  OPTIO ...

  2. Hibernate在关于一对多,多对一双向关联映射

    [Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...

  3. ThreadPoolExecutor的一点理解

    整个ThreadPoolExecutor的任务处理有4步操作: 第一步,初始的poolSize < corePoolSize,提交的runnable任务,会直接做为new一个Thread的参数, ...

  4. 二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))

    问题: 找到两个节点的二叉树的最近的共同祖先. 首先可以参考这个博客http://blog.csdn.net/cxllyg/article/details/7635992 ,写的比較具体,包含了节点包 ...

  5. Java 多线程编程两个简单的例子

    /** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...

  6. yii组态 redis主从配置(随着代码)

    最近的欲望redis 主从,但yii内建的redis 它不支持主从.不仅写了一个好办法 结构例,以下: 1.main.php通过添加下面的句子: //redis缓存配置 'cache_redis' = ...

  7. Linux 编程学习笔记----命令行参数处理

    转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行參数及解析 在使用linux时,与windows最大的不同 ...

  8. Debian 7设备nginx周围环境、编译并安装和启动

    /*********************************************************************  * Author  : Samson  * Date   ...

  9. hibernate Java 时间和日期类型 Hibernate 制图

    基础知识: 于 Java 于, 型表示的时间和日期包含: java.util.Date 和 java.util.Calendar. 外, 在 JDBC API 中还提供了 3 个扩展了 java.ut ...

  10. [.Net Tools] 超強大的封裝工具 Advanced Installer

    原文:[.Net Tools] 超强大的封装工具Advanced Installer 日前在网路上晃到这家公司的产品http://www.advancedinstaller.com/,就直接下载并且安 ...