新普金娱乐网址


你没有生于终点,但更从未亡于起源

教育学王是怎么样练成的

天堂美学|苏格拉底

  • 二月 15, 2019
  • 数学
  • 没有评论

题外话 

希腊共和国(The Republic of Greece)暂时有七个城邦是最关键的,一个是斯巴达,3个是雅典。而苏格拉底就出生在雅典的1人民家庭中。

      那篇博文首要围绕printf函数分析的,主要教师printf 使用C的可变参数机制, printf是不是可重入(是或不是线程安全),

苏格拉底在净土理学史上有很高贵的身份,但他差不离儿一贯不留给别样小说。所有的关于她的合计的行文都以由他的门生及其再传弟子所著,很像春秋时代的孔圣人。苏格拉底的死是一件十三分令人心痛的事,当时雅典城邦举行所谓的“民主”制度,而苏格拉底就是被那个鲁钝的贵族投票投死的。

printf函数的源码完毕.

关于苏格拉底的美学思想,我想经过三个地方来介绍。3个是关于文艺的有血有肉基础,另二个是有关文艺的社会功能。最终还会专门探讨一下苏格拉底的美学观点与毕达哥拉斯学派的例外。当然,笔者会结合本身的一部分领略,举一些文艺小说的事例来突显给大家。

正文

1、文艺的求实基础

1.C中可变参数机制

所谓文艺的切切实实基础,即文艺小说的发出根源哪里。

大家先举个例子,假使以后有如此三个需要”须要3个动荡参数整型求和函数”.

苏格拉底四叔是1人艺人,专门从事雕刻工作。苏格拉底早年持续过她叔叔的手艺,从这一个含义上来讲,苏格拉底也好不容易1个人创作人。

现实落到实处代码如下

眼看广大人觉着艺术就是效仿自然,但苏格拉底有更深层次的视角,他觉得“艺术不应有奴隶似的描摹自然,而应在当然形体中选拔出一部分要素,去构成贰个极美的总体。因而,他觉得歌唱家刻画出来的人物可以比原来的真人物更美。”(朱孟实《西方美学史》p37)

// 需要一个不定参数整型求和函数
int 
sum_add(int len, ...)
{
    int sum = 0;
    va_list ap; 

    va_start(ap, len); // 初始化 将ap参数指向 len 下一个参数位置处
    while (len > 0) {
        int tmp = va_arg(ap, int); // 获取当前参数,并且将ap指向 下一个参数位置处
        sum += tmp;
        --len;
    }
    va_end(ap); // 清除(销毁)ap变量

    return sum;
}

那边所说的效仿自然,并不囿于于自然风景,包涵人物、生活都包含于自然那几个概念。

 详细一点的测试代码如下

遗憾的是,西方孙吴好像并从未对苏格拉底那么些美学论点作进一步的发展。苏格拉底即便指出了法子不应该机械的模仿自然,但要么以模仿自然当做基础,所以北宋上天的点染、雕刻都以在力求真实的功底上突显人物。那种实事求是让艺术小说充满了严肃,与中国太古作画比较,紧缺了过多趣味。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

// 需要一个不定参数整型求和函数,len表示参数个数
int sum_add(int len, ...);



int main(int argc, char *argv[])
{    
    int sum;

    sum = sum_add(1, 2);
    printf("sum = %d\n",sum);

    sum = sum_add(4,1,2,3,4);
    printf("sum = %d\n", sum);

    sum = sum_add(10, 1, 2, 3, 4,5,6,7,8,9,10);
    printf("sum = %d\n", sum);

    system("pause");
    return 0;
}

《创世纪》,米开朗琪罗,力求真正

此间扯一点,对于system(“pause”); 是调用系统shell 的pause命令,就是让日前cmd关闭停留一下,输出一段话等待一下. 功效图如下

同时代中国写生,越发重视写意。《松林扬鞭图》,桃花庵主

图片 1

二,文艺的社会意义

其一功能在 Linux 有个 系统函数如下

苏格拉底认为美就是有用,他认为贰个艺术小说是还是不是美,就在于它是或不是有用。如果它是行得通的,那么它就是美的。借使损害,那么就丑。

#include <unistd.h>

// 函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号(signal)所中断。
// 返回值:只返回-1
int  pause(void);

唯独同样件事物在区其余场子,有用的也只怕变得不算。譬如矛和盾,只有当矛用来攻击,盾用来防守时,那两件事物才是实惠的,才是美的。而矛如果用来防守,很明朗它就是不行的,就不是美的。

部分时候 必要在多少个平台,下 完毕等待函数
,就须要通过宏来判断,那是很恶心的.或然是个人觉得,可移植程序内部都以黑心丑陋的 腐尸堆积体.

透过,苏格拉底得出了美的相对性,即美不是一件东西的相对化属性,它是依靠于人的定性存在的。一件东西在一些时候是美的,在好什么日期候也只怕不是美的。

上面介绍三个 自个儿写的二个通用函数  ,通用控制台学习的等待函数.

矛与盾,美是相持的

#include <stdio.h>

//6.0 程序等待函数
extern void sh_pause(void);
//6.0 等待的宏 这里 已经处理好了
#ifndef INIT_PAUSE
#define _STR_PAUSEMSG "请按任意键继续. . ."
#define INIT_PAUSE() \
    atexit(sh_pause)
#endif/* !INIT_PAUSE */

//系统等待函数
void
sh_pause(void)
{
    rewind(stdin);
    printf(_STR_PAUSEMSG);
    getchar();
}

三,与毕达哥拉斯学派的不一样

思路是先清空输入流stdin
,再用getchar等待函数,等待用户输入回车甘休本次决定台学习.

苏格拉底与毕达哥拉斯学派最大的分歧之处在于,毕达哥拉斯学派认为美的留存是纯属的,而苏格拉底认为美是相持的。

1.1 可变参数机制介绍

毕达哥拉斯学派认为,美只与事物的“数”有关,只要那一个东西的“数”是协调的,那么它就是美的。他们也从事于寻找那种和谐,“黄金分割”就是二个最卓绝的例子。围巾诗人认为,那种纯属的眼光是不不敢越雷池一步的,你认为“黄金分割”美,笔者只怕认为它不美。用数学专业来衡量一件事物美的性质,本身就是有标题标。

首先看摘录的源码,那里先分析Window 上源码,Linux上也一样.其实Linux源码更易于看,因为它简洁高效.都一般,重点看个人抉择.

苏格拉底从效果出发,得出了美的相对性。围巾作家认为,美确实是对峙的,但一件事物美不美,与其效率的维系不大。当然,前边大家还会谈到有关事物的善的题材。在很大程度上,苏格拉底关于事物效率的布道,是有关事物的善,而非事物的美。

// stdarg.h
...
#define va_start __crt_va_start
#define va_arg   __crt_va_arg
#define va_end   __crt_va_end
#define va_copy(destination, source) ((destination) = (source))
...

//vadefs.h
...
typedef char* va_list;
...   
#define _ADDRESSOF(v) (&(v))
...
#elif defined _M_IX86

    #define _INTSIZEOF(n)          ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

    #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))
    #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
    #define __crt_va_end(ap)        ((void)(ap = (va_list)0))

#elif defined _M_ARM
....

#define __crt_va_start(ap, x) __crt_va_start_a(ap, x)
...

在分析从前,摘了二个 表格,看一下只怕会简单了解一点.如下

stdarg.h数据类型

类型名称
描述
相容
va_list
用来保存宏va_arg与宏va_end所需信息
C89

 

 

 

stdarg.h宏

巨集名称
描述
相容
va_start
使va_list指向起始的参数
C89
va_arg
检索参数
C89
va_end
释放va_list
C89
va_copy
拷贝va_list的内容
C99

 

 

 

 

 

 

此地再扯一点,目前用的C标准最多是C89,流行编译器例如gcc,VS2016几近都支持,C89和C99.

其中gcc扶助的比VS要好.终究VS主打的是CSharp和CPlusPlus.

再有一个编译器Pelles C对C99协助的最好,对C11帮助的还是可以.有机会我们可以玩玩.做为小白 还期待C11推广开来.

因为C11规范对有个别观点常用模块例如二十四线程,数学复数,新的商洛库函数等等,缺点是太丑了.

上面继续回来 可变参数的话题上. 其实通晓 上面 代码,重若是知道那3个宏是怎么着意思.

那边说一下多个分包条件 是 C编译器对于可变参数函数 必须(专擅认同) 是
__cdecl 修饰的,详细的少数演说如下:

__cdecl 是C
Declaration的缩写(declaration,声明),

代表C语言默许的函数调用方法:全体参数从右到左依次入栈,那一个参数由调用者清除,称为手动清栈。

被调用函数不会须要调用者传递多少参数,调用者传递过多如故过少的参数,甚至完全不相同的参数都不会发出编译阶段的失实。

三回演讲

参数从右向左入栈 =>
最后1个参数先入栈,最终第多少个参数在栈顶

调用者,被调用函数 => b() { a();} ,
a是被调用函数,b是调用者函数

调用者清除,称为手动清栈
=> 在 b 汇编代码中 会插入 清空a函数栈的汇编代码

探讨一下,只能够这样搞,才能明白函数的进口在哪儿,否则都找不见函数参数在非凡地点. 这也是为啥可变参数需求首先个参数突显申明的原因.

而那贰个宏就是为着找到其它参数而设计的.核心是基于变量的内存布局,指针来回指.依次剖析如下:

// 定义 char* 类型,这个类型指针偏移量值为 1,
// 例如
// char *a = NULL ; 此时 a地址是 0x0
// ++a; => 此时 a地址为 0x0 + 1*1 = 0x1位置处
        typedef char* va_list;


//
// 定义获取变量地址的宏
//
#define _ADDRESSOF(v) (&(v))

再来分析 地址偏移宏

// 
// 这个宏是为了编译器字节对齐用的,用sizeof(int) 字节数进行对齐
// 
// 简化一下 sizeof(int) - 1 假定为 3,(当前2015年11月22日就是3) 
// _INTSIZEOF(n) => ((sizeof(n) + 3 ) & ~3 )
// 举个例子
//   _INTSIZEOF(int) => 4
//   _INTSIZEOF(char) => 4
//  _INTSIZEOF(double) => 8
//  _INTSIZEOF(short) => 4
// 因为编译器有内存位置调整,具体参见 struct 内存布局,毕竟都是C基础.编译器这样做之后,访问速度回快一些,根据地址取值的次数会少一些.
 #define _INTSIZEOF(n)          ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

下边的宏就不难了

// ap 是va_list 声明变量,第一次时候调用
// v 表示 可变函数中第一个参数 
// 执行完毕后 ap指向 v 变量后面的下一个 函数参数
 #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))

// t 只能是类型,int char double ....
// 操作之后 ap又指向下一个函数参数,但是返回当前ap指向的位置处
// 讲完了,关键看自己多写,多读源码.有些大神都是不看注释 直接通过源码就入手框架了
 #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))

// 清空ap变量,等同于简单的清空野指针
    #define __crt_va_end(ap)        ((void)(ap = (va_list)0))

#define va_start __crt_va_start
#define va_arg   __crt_va_arg
#define va_end   __crt_va_end

// 地址赋值 , 直接等于 主要用于 ap_two = ap_one
// 具体 写法就是 va_copy(ap_two,va_one) , 目前基本是冷板凳
#define va_copy(destination, source) ((destination) = (source))

到那里C可变函数机制的源码分析已毕.

1.2 通过多少个事例将可变参数机制结尾

 

我们的事体须求是那般的, 须求多少个机械扫描 输入的字符串,输入的字符串个数是不鲜明的.

并从中找出 长度 小于 5的 字符串,输出 索引和当前串的内容.代码如下

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

//简单的日志宏 fmt必须是字面量字符串
#define ERRLOG(fmt,...) \
        fprintf(stderr,"[%s:%s:%d]" fmt "\r\n",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__)

//简单系统等待函数
#define _STR_PAUSE "请按任意键继续. . ."
#define SPAUSE() \
    rewind(stdin),printf(_STR_PAUSE),getchar()

//
// 需要一个机器扫描 输入的字符串,输入的字符串个数是不确定的.并从中找出 长度 小于 5的 字符串, 输出 索引和当前串的内容
// 
#define _INT_FZ (5)
//
// 这里 最后一个参数 必须是 NULL,同 linux中execl函数簇参数要求
// sstr : 开始的串
//
void with_stdin(const char *sstr, ...);

int main(int argc, char *argv[])
{
    with_stdin(NULL);
    with_stdin("1","1234331","adfada","ds",NULL);
    with_stdin("a","ad","adf","asdfg","asdsdfdf","123131",NULL);
    with_stdin("1","3353432", "1234331", "adfada", "ds","dasafadfa","dasdas", NULL);

    SPAUSE();//等待函数
    return 0;
}

void 
with_stdin(const char *sstr, ...)
{
    static int __id; // 第一声明的时候赋值为0,理解成单例
    va_list ap;
    const char *tmp;

    if (NULL == sstr) {
        ERRLOG("Warning check NULL == sstr.");
        return;
    }

    if (_INT_FZ > strlen(sstr))
        printf("%d %s\n",__id,sstr);
    ++__id;

    va_start(ap, sstr);
    while ((tmp = va_arg(ap, const char*)) != NULL) {
        if (_INT_FZ > strlen(tmp))
            printf("%d %s\n", __id, tmp);
        ++__id;
    }

    va_end(ap);
}

 

2.printf 函数可重入切磋

率先我们需求搭建三个pthread 开发条件在 Window上,假诺您是用Linux,稍微新一点的系统,今后都是暗中认可pthread线程库.上边 笔者就讲解 pthread 如何搭建.

首先步 去官网上下载源码包

  
http://sourceware.org/pthreads-win32/

 本身多点点点,下载最新版的脚下是
2-9-1,好久没更新了,在window上接纳,还有个别勤奋,必要简单的改动源代码.

第二步 建一个C控制台

  用VS二〇一四 建七个 空的主宰台.如下

图片 2

其三步  在控制奥兰多添加 一些文本

  须要加上的文书如下:

图片 3

 

图片 4

图片 5

内需充分到 刚才项目 (右击在文书夹下打开这一个位置) 如下图

图片 6

末尾是那般的

图片 7

那边配置的是x86 开发环境文件多,配置x64文件就很少了. 那个学会了 今后 就特意简单了.

第五,步:修改头文件 去掉争论

 先添加这几个头文件 shift + alt
+ A,将 两个头文件添加到项目里来,如下:

图片 8

将 pthread.h 上边 299行 改成 上面那样,直接在当前目录下找头文件

#include "sched.h"

在315行 回车一下 添加上面宏注明,去掉重复结构定义

#define HAVE_STRUCT_TIMESPEC

第5步 添加一些文件包涵

首先 添加 VS打消安全监测宏 _CRT_SECURE_NO_WARNINGS

图片 9

在档次右击采纳属性,大概 键盘右击键 + 福睿斯

背后添加静态库

图片 10

末尾别的静态库,当找不见了协调添加. 当然假使 你想在 VS 通过代码添加静态库
,代码 如下

// 添加 静态库 pthreadVC2.lib
// 放在 文件一开始位置处,一般放在头文件中
#pragma comment(lib,"pthreadVC2.lib")

到此处环境就配备好了. 上边 直接切入大旨. 

2.1 printf 函数测试

率先 测试 代码如下
,须要同学团结敲三回,关于pthread的代码 依然相比复杂,当然就是大家开发库用到的大多是它中下难度部分api.

#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"

//简单的日志宏 fmt必须是字面量字符串
#define ERRLOG(fmt,...) \
        fprintf(stderr,"[%s:%s:%d]" fmt "\r\n",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__)

//简单系统等待函数
#define _STR_PAUSE "请按任意键继续. . ."
#define SPAUSE() \
    rewind(stdin),printf(_STR_PAUSE),getchar()

//每个线程打印的条数
#define _INT_CUTS (1000)
//开启的线程数
#define _INT_PTHS (4)
//线程一打印数据
#define _STR_ONES "1111111111111111111111111222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333334444444444444444444444444444444444444445555555555555555555555555555666666666666666666666666666677777777777777777777777777777777777777777777777777778888888888888888888888888888888883333333333333333333333332222222222222222222222211111111111111888888888888888888888888888899999999999999999999999999999999999999990000000000000000000000000000000"
//线程二打印数据
#define _STR_TWO "aaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssssdddddddddddddddddddddddddddddddddddddddfffffffffffffffffffffffffffgggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkfffffffffffffffffffffffffffffffffffffffffoooooooooooooooooooooooppppppppppppppppppppppppppppvvvvvvvvvvvvvvvvbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdddddddddddddds"
//线程三打印数据
#define _STR_THRE "AAAAAAAAAAAAAAAAAAAAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDDDDDDDDDDDDDDDDDDDDDDDDDDDSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCFFFFFFFFFFFFFFFF"
//线程四打印数据
#define _STR_FIV "你好好的打打打假摔帝卡发的啥都就看见大大淡蓝色空间对手卡就考虑到就阿里'省空间打算加快递费的数量级匮乏绿豆沙圣诞快乐发送的房间打扫房间卡萨丁就卡机了速度快龙卷风撒娇考虑到房间里邓丽君分手的距离看法就立刻发家里睡觉了舒服大家啦的酸辣粉就看见了看法就李开复撒地方就拉近了看法就困啦风刀霜剑快乐付京东坑垃圾费即可复读机啊健康路附近啊范德萨晶晶啊加合法的考虑加对方说对啦地方睡觉了啥打法来空间浪费大家来看范德萨龙卷风就阿里你好好的打打打假摔帝卡发的啥都就看见大大淡蓝色空间对手卡就考虑到就阿里'省空间打算加快递费的数量级匮乏绿豆沙圣诞快乐发送的房间打扫房间卡萨丁就卡机了速度快龙卷风撒娇考虑到房间里邓丽君分手的距离看法就立刻发家里睡觉了舒服大家啦的酸辣粉就看见了看法就李开复撒地方就拉近了看法就困啦风刀霜剑快乐付京东坑垃圾费即可复读机啊健康路附近啊范德萨晶晶啊加合法的考虑加对方说对啦地方睡觉了啥打法来空间浪费大家来看范德萨龙卷风就阿里"

//全局测试
static FILE *__txt;
//写入测试文件路径
#define _STR_PATH "log.txt"

//线程启动函数
void *start_printf(void *arg);

int main(int argc, char *argv[])
{
    pthread_t ths[_INT_PTHS];
    int i, j;
    int rt;

    puts("printf 线程是否安全测试开始");

    if ((__txt = fopen(_STR_PATH, "w")) == NULL) {
        ERRLOG(_STR_PATH "文件打开失败");
        exit(-1);
    }

    for (i = 0; i<_INT_PTHS; ++i) {
        rt = pthread_create(ths + i, NULL, start_printf, (void*)i);
        if (0 != rt) {
            ERRLOG("pthread_create run error %d!", rt);
            goto __for_join;
        }
    }

__for_join:
    //等待线程结束
    for (j = 0; j<i; ++j)
        pthread_join(ths[j], NULL);//索引访问错误

    puts("printf 线程是否安全测试结束");

    SPAUSE();//等待函数
    return 0;
}

//线程启动函数
void *
start_printf(void *arg)
{
    int idx = (int)arg;
    int i;

    printf("线程%d已经启动!\n", idx);
    for (i = 0; i<_INT_CUTS; ++i) {
        switch (idx) {
        case 0:
            fprintf(__txt, _STR_ONES);
            break;
        case 1:
            fprintf(__txt, _STR_TWO);
            break;
        case 2:
            fprintf(__txt, _STR_THRE);
            break;
        case 3:
            fprintf(__txt, _STR_FIV);
            break;
        default:
            printf("idx => %d 取你吗的.\r\n", idx);
        }
    }

    printf("线程%d已经关闭!\n", idx);
    return (void*)idx;
}

那边运营的结果如下:

图片 11

当然还有变化的 log.txt 文件,

图片 12

自作者批评结果是从未有过出现乱序现象, 前边看 完<<posix 多线程程序设计>> 之后, 它那里有这样一句话,posix须求ANSI C 中正式输入输出函数式线程安全的.

就此那种老标准都有惊无险,现在不用说了.

后来在 printf 源码中找见了

  /* Lock stream.  */
  _IO_cleanup_region_start ((void (*) (void *)) &_IO_funlockfile, s);
  _IO_flockfile (s);

就是加锁的意思.所以printf 是可重入的函数.说了那样多,其实意思 将来 写文件能够直接拼1个大串直接printf 就可以了.

其一细节会让自身做的日志库轮子快一点.

3.printf函数的源码达成

 那里同样作者也以window 为例 . 具体见上边代码

int __cdecl printf (
        const char *format,
        ...
        )
/*
 * stdout 'PRINT', 'F'ormatted
 */
{
    va_list arglist;
    int buffing;
    int retval;

    _VALIDATE_RETURN( (format != NULL), EINVAL, -1);

    va_start(arglist, format);

    _lock_str2(1, stdout);
    __try {
        buffing = _stbuf(stdout);

        retval = _output_l(stdout,format,NULL,arglist);

        _ftbuf(buffing, stdout);

    }
    __finally {
        _unlock_str2(1, stdout);
    }

    return(retval);
}

是或不是深感很粗略,先不难检测一下

末端获取fmt之后的参数,并且加锁 调用另一个体系输出函数_output_l

末掌握锁 再次来到结果.

嘿嘿,其实 printf函数 源码 真的很简短,只要明白了 可变参数机制读下边代码很简单.它的复杂见另七个函数.

Linux上是vprintf函数,window上是_output_l函数,以vprintf为例,难题在于 格式语法解析,

它完毕的效益也等于1个简短的 代码解析器. 总共达成代码2千多行. 看看觉得 Linux内核确实相比较屌,单单这一个vprintf.

兑现就用了

C模板技术

状态表机制

底层文件读写,CPU变量优化,宏,指针,共用体漫天飞.但那几个函数 依然得以搞得.紧要思路是环绕 状态表(可以领略为业务表)

姣好相应的效益,在形成进程中,对流举办控制,该保留的保留,该出口输入,改扩容的扩容,通过文件锁锁住 流输入输出.

实在有个别时候 技术 如故有点难的, 更加多国同行喜欢不是技巧,而是 可以增强 人命币的 手段,顺带做一件其余事.

穷人没有采用,有的是生存和挣扎.长这么大才明白初中生物老师说的,物竞天择适者生存,呵呵大合唱.

 

后记

  到那边基本就为止,有点半涂而废,可是printf
2千行代码,如果解析起来,其实相当于说白话.熟知了都以统筹和业务.

一定有错的,例如错别字,技术错误等等,欢迎互换指正,下次右机会享受pthread 开发专题.最后前边分享多少个 本文参考的事物

1. C底层库源码 Window和Linux

2. posix 八线程程序设计

 

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图