




免费预览已结束,剩余100页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 1 页 1编程规范编程规范 1 1 内存分配后要调用 memset strncpy 要比 strcpy 安全 有时最好调用 memcpy 定义结构 不是结构指针 后 调用 memset Socket 编程不要忘记检测返回错误检测 中断有可能会终止某些非原子操作函数 read write send recev 2调试编译调试编译 2 1gcc 编译选项和编译选项和 DEFS Gcc is a ansi copiler g w O0 Reduce compilation time and make debugging produce the expected results This is the default O1 O2 O3 最高级别优化 ansi fPIC shared D D 第 2 页 define symbols either as identifiers Didentifer or as values Dsymbol value in a similar fashion as the define preprocessor command For further information on general compiler options and the GNU compiler refer to Appendix DSYSV DSYSV A lot of clients even some which have explicit SVR4 support require DSYSV when building under SVR4 This will not be set when using the default x386 cf and site def A quick fix is to add something like the following to the client s Imakefile if if SystemV4SystemV4 DEFINESDEFINES DSYSV DSYSV OTHER CLIENT DEPENDENT DEFINESOTHER CLIENT DEPENDENT DEFINES endif endif The best solution is to modify the code so it compiles correctly without DSYSV march pentium4 4 1 0 版本以上支持此选项 2 2VC 编译选项 编译选项 VC8 2005 cl nologo 编译时不显示编译选项 Od 无优化 W3 告警级别为 3 MDd DLL 支持 多线程 调试 Yu stdafx h 使用预编译头 D WIN32 windows32 程序 D DEBUG 编译的对象加入调试信息 类似于 gcc 编译选项 g Fo 调试相关 Fp 浮点数相关 Fd 调试信息相关 第 3 页 Gd 调用约定为 cdecl Gm 最小编译 Tp 编译成 c 代码 ZI 调试时可以编辑并运行 Wp64 检测 64 位可移植性问题 EHsc 启用 C 异常处理 RTC1 基本运行时检查 RTC1 RTCsu 包括 RTCs 堆栈帧检查 和 RTCu 未初始化变 量检查 Za Ze Visual C 编译器提供许多在 ANSI C 或 ANSI C 标准中指定的那些功能以外的功能 这些功能统称为 C 和 C 的 Microsoft 扩展 这些扩展在指定 Ze 选项时可用 而在 指定 Za 选项时不可用 如果打算将程序移植到其他环境 请禁用语言扩展 编译器将扩展关键字视为简单标识符 禁用其他 Microsoft 扩展 并且自动定义 C 程序的 STDC 预定义宏 Zc Zc wchar t c 2 3调用约定调用约定 cdecl 是 C Declaration 的缩写 表示 C 语言默认的函数调用方法 所有参数 从右到左依次入栈 这些参数由调用者清除 称为手动清栈 被调用函数无需 要求调用者传递多少参数 调用者传递过多或者过少的参数 甚至完全不同的 参数都不会产生编译阶段的错误 stdcall 是 Standard Call 的缩写 是 C 的标准调用方式 所有参数从 右到左依次入栈 如果是调用类成员的话 最后一个入栈的是 this 指针 这些 堆栈中的参数由被调用的 函数在返回后清除 使用的指令是 retn X X 表示 参数占用的字节数 CPU 在 ret 之后自动弹出 X 个字节的堆栈空间 称为自动 清栈 函数在编译的时候就必须确定参数个数 并且调用者必须严格的 控制参 数的生成 不能多 不能少 否则返回后会出错 PASCAL 是 Pascal 语言的函数调用方式 也可以在 C C 中使用 参数压 栈顺序与前两者相反 返回时的清栈方式忘记了 fastcall 是编译器指定的快速调用方式 由于大多数的函数参数个数很 少 使用堆栈传递比较费时 因此 fastcall 通常规定将前两个 或若干个 第 4 页 参数由寄存器传 递 其余参数还是通过堆栈传递 不同编译器编译的程序规定 的寄存器不同 返回方式和 stdcall 相当 thiscall 是为了解决类成员调用中 this 指针传递而规定的 thiscall 要求把 this 指针放在特定寄存器中 该寄存器由编译器决定 VC 使用 ecx Borland 的 C 编译器使用 eax 返回方式和 stdcall 相当 fastcall 和 thiscall 涉及的寄存器由编译器决定 因此不能用作跨编 译器的接口 所以 Windows 上的 COM 对象接口都定义为 stdcall 调用方式 C 中不加说明默认函数为 cdecl 方式 C 中也只能用这种方式 C 也一 样 但是默认的调用方式可以在 IDE 环境中设置 带有可变参数的函数必须且只能使用 cdecl 方式 例如下面的函数 int printf char fmtStr int scanf char fmtStr 2 4ansi c ansi c 与与 miscrosoft 扩展扩展 Cl exe 编译器支持下列两种非 ANSI 转换 需要编译成 c 代码 编译选项为 Tc 否 则某些操作是编译不过去的 使用非 ANSI 转换产生左值 char p int p 可用如下方式重写上例 以符合 ANSI C 标准 p char int p 1 将函数指针以非 ANSI 方式转换为数据指针 int pfunc int pdata pdata int pfunc 若要在保持 ANSI 兼容性的同时执行上述转换 必须在将函数指针转换为数 据指针前先将其转换为 int pdata int int pfunc 2 5内存检测工具内存检测工具 IBM Purify 工具的使用工具的使用 2 6内存检测工具内存检测工具 Valgrind 工具的使用工具的使用 3杂项杂项 3 1Macro define define UNUSED x void x define CONST STR LEN x x x sizeof x 1 0 第 5 页 c 32 将大写字符转换为小写字符 c 将小写字符转换为大写字符 3 2国际化支持国际化支持 这里说的是 windows 平台的情况 其他平台有待确认 UNICODE 字节 MBCS 字节 ASCII 码字节 Unicode 字符都是 16 字节 而 ASCII 字节是八位字节 setlocale LC ALL 设置本地语言与区域设置 这个是在国际化编程时使用 如中国则使 用 setlocale LC ALL zh CN 区域设置改变那些内容区域设置改变那些内容 区域设置 ID 反映特定地理区域的当地约定和语言 可能有一个 以上的国家 地区说某种特定的语言 例如 巴西和葡萄牙都说葡萄牙语 反之 一个国家 地 区可能有一种以上的官方语言 例如 加拿大有两种官方语言 英语和法语 因此 加拿大有 两个不同的区域设置 加拿大英语和加拿大法语 一些与区域设置相关的类别包括日期的格式 设置和货币值的显示格式 语言确定文本和数据的格式约定 而国家 地区则确定区域约定 每 种语言都有一个由代码页表示的唯一映射 包括字母表中的字符以外的字符 如标点符号和数 字 代码页是一个字符集并且与语言相关 因此 区域设置就成为语言 国家 地区和代码页 的唯一组合 可以通过调用 setlocale 函数在运行时更改区域设置和代码页设置 代码页 代码页 不同的语言可能使用不同的代码页 例如 ANSI 代码页 1252 用于英语和大多 数欧洲语言 而 ANSI 代码页 932 则用于日本汉字 实际上 所有代码页都共享 ASCII 字符 集中最低的 128 个字符 0 x00 到 0 x7F C 运行时库有两类内部代码页 运行时库有两类内部代码页 区域设置和多字节 MBCS 在程序执行期间可以更改当 前代码页 有关 setlocale 和 setmbcp 函数的信息 请参见文档 而且 运行时库可以获取 并使用操作系统代码页的值 在 Windows 2000 中 操作系统代码页是 系统默认 ANSI 代 码页 此代码页在程序的执行期间保持不变 4Posix 1 多线程多线程 4 1基于基于 linux 平台平台 在 Red Hat Linux release 9 Shrike 平台下测试通过 4 2线程和进程的区别线程和进程的区别 线程的提出可能是为了多 cpu 并行处理 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享 数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是 为了提高程序的并发度 从而提高程序运行效率和响应时间 第 6 页 线程和进程在使用上各有优缺点 线程执行开销小 但不利于资源的管理和保护 而进程 正相反 同时 线程适合于在 SMP 机器上运行 而进程则可以跨机器迁移 4 3线程安全概念线程安全概念 4 4线程同步概念线程同步概念 4 5线程创建线程创建 Linux 是如果实现线程的 我们知道 Linux 的线程实现是在核外进行的 核内提供的是创建进程的接口 do fork 内核提供了两个系统调用 clone 和 fork 最终都用不同的参数调用 do fork 核内 API 当然 要想实现线程 没有核心对多进程 其实是轻量级进程 共享数据段的支持是 不行 的 因此 do fork 提供了很多参数 包括 CLONE VM 共享内存空间 CLONE FS 共享文件系统信息 CLONE FILES 共享文件描述符表 CLONE SIGHAND 共享信号句柄表 和 CLONE PID 共享进程 ID 仅对核内进程 即 0 号进 程有效 当使用 fork 系统调用时 内核调用 do fork 不使用任何共享属性 进程拥有 独立的运行环境 而使用 pthread create 来创建线程时 则 最终设置了所有这些属性来 调用 clone 而这些参数又全部传给核内的 do fork 从而创建的 进程 拥有共享的 运行环境 只有栈是独立 的 由 clone 传入 Linux 线程在核内是以轻量级进程的形式存在的 拥有独立的进程表项 而所有的创建 同步 删除等操作都在核外 pthread 库中进行 pthread 库使用一个管理线程 pthread manager 每个进程独立且唯一 来管理线程的创建和终止 为线程分配线 程 ID 发送线程相关的信号 比如 Cancel 而主线程 pthread create 的调用者 则通过管道将请求信息传给管理线程 Create a new thread starting with execution of START ROUTINE getting passed ARG Creation attributed come from ATTR The new handle is stored in NEWTHREAD extern int pthread create pthread t restrict newthread const pthread attr t restrict attr void start routine void void restrict arg THROW 函数功能 函数功能 创建线程 通过 pthread 库的 pthread manager 来和内核通信 以建立内核的 轻量级进程程 数据资源共享 有独立的栈 独立执行序列 参数 参数 第 7 页 newthread 是生成新线程的 handler 类型是 pthread t attr 含有初始化线程所需要的属性 类型是 pthread attr t 如果不指定属性对象 将其置 为 NULL 则创建一个缺省的线程 有如下属性 非绑定的 未分离的 由一个缺省大小的堆栈 具有和父线程一样的优先级 注意 在创建子线程时 传给子线程的输入参数最好是由 malloc 函数返回的指针或指向 全局变量的指针 而不要是指向局部变量的指针 要保证子线程处理参数时 该区域仍然 有效 detachstate 表示新线程是否与进程中其他线程脱离同步 如果置位则新线程不能用 pthread join 来同步 且在退出时自行释放 所占用的资源 缺省为 PTHREAD CREATE JOINABLE 状态 这个属性也可以在线程创建并运行以后用 pthread detach 来设 置 而一旦设置为 PTHREAD CREATE DETACH 状态 不论是创建时设 置还是运行时设置 则不能再恢复到 PTHREAD CREATE JOINABLE 状态 schedpolicy 表示新线程的调度策略 主要包括 SCHED OTHER 正常 非实时 SCHED RR 实时 轮转法 和 SCHED FIFO 实时 先入先出 三种 缺省为 SCHED OTHER 后两种调度策略仅对超级用户有效 运行时可以用过 pthread setschedparam 来改变 schedparam 一个 struct sched param 结构 目前仅有一个 sched priority 整型变量 表示线程的运行优先级 这个参数仅当调度策略为实时 即 SCHED RR 或 SCHED FIFO 时 才有效 并可以在运行时通过 pthread setschedparam 函数来改变 缺省为 0 inheritsched 有两种值可供选择 PTHREAD EXPLICIT SCHED 和 PTHREAD INHERIT SCHED 前者表 示新线程使用显式指定调度策略和调度参数 即 attr 中 的值 而后者表示继承调用者线程的值 缺省为 PTHREAD EXPLICIT SCHED scope 表示线程间竞争 CPU 的范围 也就是说线程优先级的有效范围 POSIX 的标准中 定义了两个值 PTHREAD SCOPE SYSTEM 和 PTHREAD SCOPE PROCESS 前者表示与系统中所 有线程一起竞争 CPU 时间 后者表示仅与同 进程中的线程竞争 CPU 目前 LinuxThreads 仅实现了 PTHREAD SCOPE SYSTEM 一值 pthread attr t 结构中还有一些值 但不使用 pthread create 来设置 为了设置这些属性 POSIX 定义了一系列属性设置函数 包括 pthread attr init pthread attr destroy 和与各个属性相关的 pthread attr get pthread attr set 函数 start routine 是线程处理函数 返回类型是 void 第 8 页 arg 是传入 start routine 的参数 如果为 NULL 则无参数 返回值 返回值 相关函数 相关函数 pthread attr init 4 6线程等待线程等待 Make calling thread wait for termination of the thread TH The exit status of the thread is stored in THREAD RETURN if THREAD RETURN is not NULL This function is a cancellation point and therefore not marked with THROW extern int pthread join pthread t th void thread return 函数功能 调用线程等待新创建的线程 参数 th 等待的线程 返回值 相关函数 备注 4 7线程取消线程取消 定义 一般情况下 线程在其主体函数退出的时候会自动终止 但同时也可以因为接收到另 一个线程发来的终止 取消 请求而强制终止 语义 线程取消的方法是向目标线程发 Cancel 信号 但如何处理 Cancel 信号则由目标线程自己 决定 或者忽略 或者立即终止 或者继续运行至 Cancelation point 取消点 由不 同的 Cancelation 状态决定 第 9 页 线程接收到 CANCEL 信号的缺省处理 即 pthread create 创建线程的缺省状态 是继续 运行至取消点 也就是说设置一个 CANCELED 状态 线程继续运行 只有运行至 Cancelation point 的时候才会退出 取消点 根据 POSIX 标准 pthread join pthread testcancel pthread cond wait pthread cond timedwait sem wait sigwait 等函数以及 read write 等会引起阻塞的系统调用都是 Cancelation point 而其他 pthread 函数都不会引起 Cancelation 动作 但是 pthread cancel 的手 册页声称 由于 LinuxThread 库与 C 库结合得不好 因 而目前 C 库函数都不是 Cancelation point 但 CANCEL 信号会使线程从阻 塞 的系统调用中退出 并置 EINTR 错误码 因此可以在需要作为 Cancelation point 的系统调用前后调用 pthread testcancel 从而达到 POSIX 标准所要 求的目标 即如下代码段 pthread testcancel retcode read fd buffer length pthread testcancel 如果线程处于无限循环中 且循环体内没有执行至取消点的必然路径 则线程无法由 外部其他线程的取消请求而终止 因此在这样的循环体的必经路径上应该加入 pthread testcancel 调用 相关函数 int pthread cancel pthread t thread 发送终止信号给 thread 线程 如果成功则返回 0 否则为非 0 值 发送成功并 不意味着 thread 会终止 int pthread setcancelstate int state int oldstate 设置本线程对 Cancel 信号的反应 state 有两种值 PTHREAD CANCEL ENABLE 缺省 和 PTHREAD CANCEL DISABLE 分别表示收到 信号后设为 CANCLED 状态和忽略 CANCEL 信号继续运行 old state 如果不为 NULL 则存入原来的 Cancel 状态以便恢复 int pthread setcanceltype int type int oldtype 设置本线程取消动作的执行时机 type 由两种取值 PTHREAD CANCEL DEFFERED 和 PTHREAD CANCEL ASYCHRONOUS 仅当 Cancel 状 态为 Enable 时有效 分别表示收到信号后继续运行至下一个取消点再退出和立 即执行取消动作 退出 oldtype 如果不为 NULL 则存入运来的取消动作类型 值 第 10 页 void pthread testcancel void 检查本线程是否处于 Canceld 状态 如果是 则进行取消动作 否则直接返回 4 8线程返回线程返回 Terminate calling thread The registered cleanup handlers are called via exception handling so we cannot mark this function with THROW extern void pthread exit void retval attribute noreturn 函数功能 函数功能 终止调用线程 参数 参数 返回值 返回值 相关函数相关函数 Clean up and exit pthread attr destroy pthread mutex destroy pthread cond destroy pthread exit NULL 4 9设置线程属性设置线程属性 pthread attr init pthread attr t attr 这个函数必须在 pthread create 函数之前调用 属性对象主要包括是否绑定 是否分离 堆栈地址 堆栈大小 优先级 默认的属性为非绑定 非分离 缺省 1M 的堆栈 与 父进程同样级别的优先级 4 10线程种类线程种类 用户线程 轻线程 内核线程 4 11设定线程绑定状态设定线程绑定状态 pthread attr setscope pthread atrr t attr PTHREAD SCOPE SYSTEM 第 11 页 设置线程绑定状态也就是设置线程为用户线程还是轻线程 4 12设置线程分离状态设置线程分离状态 pthread attr setdetachstate pthread attr t attr int detachstate 默认状态下不分离 只有 pthread join 返回时 线程才终止 释放相应的资源 分离 后线程执行完毕后马上释放资源 第二个参数可以设置为 PTHREAD CREATE DETACHED 和 PTHREAD CREATE JOINABLE 注意 注意 如果设置一个线程为分离线程 而这个线程运行又非常快 它很可能在 pthread create 函数返回之前就终止了 它终止以后就可能将线程号和系统资源移交给其他 的线程使用 这样调用 pthread create 的线程就得到了错误的线程号 要避免这种情况可以 采取一定的同步措施 最简单的方法之一是可以在被创建的线程里调用 pthread cond timewait 函数 让这个线程等待一会儿 留出足够的时间让函数 pthread create 返回 设置一段等待时间 是在多线程编程里常用的方法 但是注意不要使 用诸如 wait 之类的函数 它们是使整个进程睡眠 并不能解决线程同步的问题 4 13设置线程的优先级设置线程的优先级 pthread set schedparam pthread attr t attr sched param par pthread set schedparam pthread attr t attr sched param par par sched priority 4 14线程数据相关的函数线程数据相关的函数 4 15线程数据线程数据 数据分为全局数据 局部数据 线程数据 TSD thread specific data 4 15 1键的概念键的概念 键是标识线程的 是和线程关联的 在进程中键和线程数据组合成标识是唯一的 4 15 2创建键创建键 pthread key create pthread key t key void func void 4 15 3为键指定数据为键指定数据 pthread setspecific pthread key t key const void pointer 4 15 4获得指定键的数据获得指定键的数据 pthread getspecific pthread key t key 第 12 页 4 15 5删除键删除键 Pthread key delete pthread key t key 线程数据的使用流程说明 以创建线程数据的使用流程说明 以创建 Fl Window 类型为例子 这是图形界面开发工具类型为例子 这是图形界面开发工具 FLTK 中的数据类型 中的数据类型 通常 pthread key create 通常和 pthread once 联合使用 Void createMyWindow Static pthread once t once Pthread key t key Pthread once F1 Window win new F1 Window 关联键与数据之前要释放数据占用内存 释放就是通过 freeWin 来实现的 Pthread setspecific key win Void createMyKey void Pthread key create key freeWin Void freeWin F1 Window win delete win 4 16互斥锁互斥锁 互斥锁主要是防止线程同时执行同一段代码 int pthread mutex init pthread mutex t mutex pthread mutexattr t attr int pthread mutexattr init pthread mutexattr t attr int pthread mutexattr setshared pthread muexattr t attr int shared int pthread mutexattr settype pthread mutexattr t attr int kind 第 13 页 如果需要声明特定属性的互斥锁 须调用函数 pthread mutexattr init 函数 pthread mutexattr setpshared 和函数 pthread mutexattr settype 用来设置互斥锁属性 前一个 函数设置属性 pshared 它有两个取值 PTHREAD PROCESS PRIVATE 和 PTHREAD PROCESS SHARED PTHREAD PROCESS PRIVATE 用于同步本进程的不 同线程 PTHREAD PROCESS SHARED 用来不同进程中的线程同步 在上面的例子中 我 们使用的是默认属性 PTHREAD PROCESS PRIVATE 后者用来设置互斥锁类型 可选 的类型有 PTHREAD MUTEX NORMAL PTHREAD MUTEX ERRORCHECK PTHREAD MUTE X RECURSIVE 和 PTHREAD MUTEX DEFAULT 它们分别定义了不同的上所 解锁机 制 一般情况下 选用最后一个默认属性 pthread mutex lock pthread mutex t mutex pthread mutex unclock pthread mutex t mutex pthread delay np timespec delay 注意 线程必须获得共享数据对应的锁才能保证对共享数据的同步 也就是保证在另 一个线程对共享数据修改完之后 另一个线程进行读 4 17读写锁读写锁 有时我们会用到读写锁 系统已经实现读写锁 如果没有也可以由互斥锁和条件变量 来实现 读写锁相比较互斥锁的优点是 互斥锁把所有试图进入临界区的所有线程都锁住 该 临界区往往是对某个共享数据的读或写 而我们有时可以将这种读与写分开 可以在某些 情况下提高效率 只要没有其他线程写 其他任意数目个线程都可以获取该读写锁用于读 不能用于写 而只有没有任意线程访问 才能获取这个读写锁进行写 而这时也不能读 写的时候是独占的 而读的时候是共享的 读写锁最好的应用例子是访问银行帐户 当帐 户在更新的时候 不能对这个帐户做任何访问 而当读的时候 可以做访问 但是不能写 读写锁的数据类型为 pthread rwlock t 静态分配的锁用 PTHREAD RW LOCK INITIALIZER Pthread rwlock rdlock 函数用于获取一个读取锁 相对应的 pthread rwlock wrlock 用于获取一个写入锁 如果读写锁已被占 则阻塞该线程 而另一个函数 pthread rwlock trylock 如果马上获得不到锁 它不阻塞 而是马上返回 EBUSY 错误 第 14 页 锁也可以这样初始化 动态 并且可指定锁属性 如果 attr 为空 那么使用默认值 要想更改锁的属性 通过 pthread rwlockattr t 来修改它 但是修改过程稍复杂一些 创建属性对象 初始化属性对象 再调用设置函数 如下 Pthread rwlockattr t attr 注意 注意 要防止死锁 pthread rdlock trylock 4 18条件变量条件变量 pthread cond t extern int pthread cond init pthread cond t cond const pthread condattr t condattr extern int pthread cond wait pthread cond t cond pthread mutex t mutex extern int pthread cond timewait const pthread cond t cond const pthread mutex t mutex const struct timespec spectime 4 19信号量信号量 信号量控制对公共资源的访问 7666y0 第 15 页 4 20多线程编程注意多线程编程注意 1 多线程编程很微妙 2 要注意理解多线程的数据 数据总的分为共享数据和线程私有数据 线程私有数 据可以使用键 注意要想 host 线程和其它线程交换数据 在 pthread create 中 输入参数 也可以定义共享数据来交换数据 不过要采用同步机制 3 锁 锁属性 条件变量 条件变量属性调用之前必须要初始化 否则程序会出现 运行时错误 4 注意要防止内存泄漏 锁 锁属性 条件变量 条件变量属性使用完之后要 destroy 否则会出现内存泄漏 4 21线程同步示例线程同步示例 典型的生产者典型的生产者 消费者问题消费者问题 这是一个典型的生产者 消费者问题 也就是生产者产生某个事件或达到某个条件时 会通知消费者来处理这个事件或处理某个任务 生产者可能是多个 消费者也可能是多个 这种生产者 消费者问题 可以使用多线程技术来解决 当前这个例子是对多个生产者执行次数进行计数 每执行一次就通知消费者 消费者 目前是空处理 本程序涉及两个同步 第一个是多个生产者之间的数据共享需要同步 这 个同步是由锁机制实现的 而且多个生产者的执行是随机的 你不知道何时那个生产者执 行 其采用的是系统默认执行策略 这个执行策略可以由线程优先级以及线程的属性等来 控制 另一个同步是生产者和消费者之间的同步 当任意一个生产者执行一次后 会通知 消费者执行一次 这个同步是用锁和条件变量来共同实现的 锁和条件变量必须成对出现 include include include include include include unpipc h define MAX COUNT 1000000 第 16 页 producer consumer question can be resolved by the multi thread and synchronization mechinisam The best solution as follow struct this struct is for producers to keep sychonized pthread mutex t mutex int exec total shared PTHREAD MUTEX INITIALIZER 0 struct pthread mutex t mutex pthread cond t cond int tid int count int ready mutex cond PTHREAD MUTEX INITIALIZER PTHREAD COND INITIALIZER typedef struct s info int tid int count char desc 20 info pinfo void producer void void consumer void 第 17 页 int arr 5 int main create the producer threads int i 0 int nthread 5 info myinfo nthread pthread t tid nthread pthread t tid consumer memset myinfo 0 sizeof myinfo make all of threads can run the number of which is nthread set concurrency nthread 1 for i 0 i nthread i arr i 0 Pthread create create consumer thread that is only one Pthread create join all producers for i 0 i nthread i 第 18 页 Pthread join tid i NULL join consumer Pthread join tid consumer NULL ouput the statistics of all of threads for i 0 i nthread i Pthread join tid i NULL join consumer Pthread join tid consumer NULL ouput the statistics of all of threads for i 0 i MAX COUNT Pthread mutex unlock return NULL shared exec total Pthread mutex unlock anthor citical section to sigal the consumer Pthread mutex lock if mutex cond ready 0 notify the consumer as one of producers is ready that is when a producer have executed the ready will be added by 1 and the consumer will be notified through sending the cond Pthread cond signal mutex cond ready Pthread mutex unlock int arg 1 第 20 页 void consumer void arg int i 0 for i 0 i MAX COUNT i citical section minus the cond of ready and notify the producer Pthread mutex lock while mutex cond ready 0 Pthread cond wait mutex cond ready notify the producers that is when consumer finisted his task the ready will be minused by 1 and the producers will be notified through sending the cond show who sned signal and what s his count of executing printf who d count d n mutex cond tid mutex cond count Pthread mutex unlock return NULL 下面给出了进一步的实现 如果考虑线程执行优先级的问题 以及线程取消问题的实 现 这将在更高级版本的线程编程书中描述 第 21 页 4 22线程同步示例线程同步示例 线程取消例子 其中使用的是读写锁 线程取消例子 其中使用的是读写锁 技巧 如何重新屏蔽系统定义 比如重新定义 pthread rwlock t 5C 网络编程网络编程 5 1测试平台测试平台 FC5 5 2OSI 模型模型 5 3了解了解 A B C 类网络类网络 根据子网掩码计算子网能够连多少台机根据子网掩码计算子网能够连多少台机 为了给不同规模的网络提供必要的灵活性 IP 地址的设计者将 IP 地址空间划分为五个不同的地址类 别 如下表所示 其中 A B C 三类最为常用 A 类 IP 地址 第 22 页 一个 A 类 IP 地址由 1 字节的网络地址和 3 字节主机地址组成 网络地址的最高位必须是 0 地址范围 从 1 0 0 0 到 126 0 0 0 可用的 A 类网络有 126 个 每个网络能容纳 1 亿多个主机 需要注意的是网络 号不能为 127 这是因为该网络号被保留用作回路及诊断功能 B 类 IP 地址 一个 B 类 IP 地址由 2 个字节的网络地址和 2 个字节的主机地址组成 网络地址的最高位必须是 10 地 址范围从 128 0 0 0 到 191 255 255 255 可用的 B 类网络有 16382 个 每个网络能容纳 6 万多个主机 C 类 IP 地址 一个 C 类 IP 地址由 3 字节的网络地址和 1 字节的主机地址组成 网络地址的最高位必须是 110 范围从 192 0 0 0 到 223 255 255 255 C 类网络可达 209 万余个 每个网络能容纳 254 个主机 为了提高 IP 地址的使用效率 可将一个网络划分为子网 采用借位的方式 从主机位最高位开始借位变 为新的子网位 所剩余的部分则仍为主机位 这使得 IP 地址的结构分为三部分 网络类型位 子网位和 主机位 引入子网概念后 网络位加上子网位才能全局唯一地标识一个网络 把所有的网络位用引入子网概念后 网络位加上子网位才能全局唯一地标识一个网络 把所有的网络位用 1 来标识 主机位来标识 主机位 用用 0 来标识 就得到了子网掩码 来标识 就得到了子网掩码 子网编址使得 IP 地址具有一定的内部层次结构 这种层次结构便于 IP 地址分配和管理 IP 地址由 32 位二进制数表示 我们可将其分为 4 个字段 每字段 8 位 也就是一字节 为了方便表示和 记忆 将每个字段的二进制数换算成十进制数 并其间用 分隔 就是我们常见的 IP 形式 例如 202 64 152 9 对于 A 类 IP 地址来说 第一字节为网络地址标识 后三字节为主机地址标识 这样说明白了吧 因为您的局域网有 400 台主机 子网掩码用 255 255 0 0 ip 地址用楼下的方案可以 网关地址一般设置成 x x x 1 的形式 A 类 B 类 C 类网络的地址范围 二进制 0000 0000 0111 1111 A 127 1000 0000 1011 1111 B 191 1100 0000 1101 1111 C 223 0 127 A 128 191 B 192 223 C 其中 0 127 128 191 192 223 不能作为网络地址 第 23 页 A 类网络最高位为 0 网络号由前 8 位标识 主机号由后 32 8 位标识 因此 A 类网络网络地址为 1 126 个 而主机地址个数为 2 32 8 2 16777216 2 16777214 个 B 类网络最高两位为 10 网络号由后 16 2 位标识 因此 B 类网络一共有 2 14 2 16384 个 2 是为了 去掉 128 和 191 两个网络号 每个 B 类网络最多可以容纳 2 16 2 共计 65534 台主机 减 2 是减去全 0 和全 1 的主机地址 C 类地址最高三位为 110 用前二十四位表示网络号 取值范围是 1100 0000 1101 1111 192 223 所以 C 类网最多有 2 24 3 2 共计 2097150 个 而主机个数为 254 个 去掉 0 和 255 给出一个网址和子网掩码 怎么计算子网地址和主机地址 192 168 200 13 255 255 255 0 网络号 将网址和子网掩码转换成二进制 两者 and 运算 即得出网络号 192 168 200 0 主机号 将网址和子网掩码转换成二进制 子网掩码取反 与网址 and 运算 得 0 0 0 13 5 4IP 寻址存在的一些问题寻址存在的一些问题 IP 的设计者怎么也没有想到 IP 网络发展规模如此之快速 目前存在一些问题 网间 网规模急速膨胀 网间寻址比较慢 可以采用子网地址复用技术 subneting 解决 具体 详细参考 baidu 子网掩码 5 5Socket 起源起源 1983 年的 BSD4 2 第 24 页 第 25 页 5 6连接 终止连接编程模型连接 终止连接编程模型 这是经典的基于 Socket 的 C S 编程模型 服务器处于监听状态 客户端向服务器发出 连接请求 经过 TCP 三路握手 建立连接 然后客户端和服务器之间就可以通信了 1 服务器通过 sockt bind listen 为连接做好准备 被动连接 2 客户端发送一个 SYN 表示同步的意思 分节 segment 告诉服务器客户端将 在连接中发送数据的初始序列号 这是主动连接 SYN 帧不包含数据 只包含 IP head tcp head tcp option 3 服务器必须确认客户的 SYN 发送 ACK 同时也要发送自己的 SYN 它包含服 务器向客户端发送数据的初始序列号 4 客户发送 ACK 第 26 页 TCP 选项包括 MSS Maximum Segment Size 选项 窗口选项 时间戳选项 四路终止连接 1 客户端发送终止分节 FIN 2 服务端收到 FIN 发送 ACK 将 FIN 分节放到所有数据分节之后 3 服务端过一段时间 服务端处理完所有接收的数据以后 发送 FIN 到客户端 4 客户端收到 FIN 后 发送 ACK 到服务端 5 7网络编程的一些限制网络编程的一些限制 MTU 最大可传输单元 是由硬件决定的 比如以太网是 1500bytes 使用 ppp 协议的 链路可配置 老的 SLIP 链
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025陕西建工新能源有限公司校园招聘(27人)笔试参考题库附带答案详解
- 2025辽宁沈阳地铁集团有限公司所属公司招聘11人笔试参考题库附带答案详解
- 2025福建省船舶工业集团有限公司招聘5人笔试参考题库附带答案详解
- 2025年芜湖城市园林集团股份有限公司招聘30人笔试参考题库附带答案详解
- 2025年湖南长沙振望投资发展有限公司招聘8人笔试参考题库附带答案详解
- 2025年榆林市公共交通总公司招聘(57人)笔试参考题库附带答案详解
- 2025年山东电工电气集团有限公司社会招聘(44人)笔试参考题库附带答案详解
- 2025年国网河南省电力公司招聘高校毕业生约350人(第二批)笔试参考题库附带答案详解
- 2025年合肥市建投集团春季招聘89人笔试参考题库附带答案详解
- 2025四川九州电子科技股份有限公司招聘生产装配等岗位72人笔试参考题库附带答案详解
- 世界避孕日培训
- 政务摄影培训课件模板
- 职业健康卫生培训课件
- 快递行业包裹分拣操作流程模拟题
- 辅助生殖妊娠营养干预
- 模块六 点的投影(课件)-中职高考《机械制图》一轮复习(高教版第5版)
- 健康素养促进项目课件
- 2024湘美版小学书法三年级上册教学设计(附目录)
- 固定摊位合租协议书
- 2025年国企人力资源管理岗招聘考试真题卷(含岗位说明书)
- 中国药典2025年版1~4部目录
评论
0/150
提交评论