UNIX 多线程编程入门

(本文主要根据 APUE第二版 第11、12章以及UNP (《UNIX network programming--the socket networking API》)第三版第一卷 第26章 学习总结而来,特此声明)


1,简介

    一般的我们在网络服务器端实现多个接入连接的处理时是通过fork()得到多个进程来分别的对付各个接入连接。但是使用fork()产生进程这种方式也是有缺点的,主要的缺点有两点,一是expensive,即由于在产生进程时,是完全的复制了原来进程的各个数据区,包括存储全局变量、全局数据的的heap,自身数据的stack等等,所以需要的存储空间比较多。第二点则是新产生后的进程与原来的父进程之间的沟通比较麻烦,由于是完全的复制,所以新的进程内对许多变量的修改与父进程是独立的(甚至有时候子进程与父进程之间的运行顺序也都是完全随机的,由系统内的调度程序来根据情况与一些策略加以指定),这样当需要父进程能够感知到子进程的修改时,需要他们之间共同的交互数据时,便需要使用信号量等系统级的信息交互机制,显得较为复杂。

   正如我们在OS课程中学习到的基本原理那样,unix中的线程thread则相当于light-process,他的优点就是弥补了以上两点不足。首先,它是与进程共享存储空间的,只有与自身标示、属性相关的一小部分存储需要操作系统为它分配。这样进程的第二个问题也就迎刃而解,子线程完全可以对进程的变量加以修改,而其他该进程内的线程或者该进程自身可以直接获取得到修改后的变量值。当然,由于这种多线程的引入,自然而然的也就有了临界区保护的问题,即如何控制线程的同步性,防止进程之间的读写过程发生混乱,这是需要在使用多线程编程时特别注意的一点。


2,基本的线程相关函数


pthread_create function


#include <pthread.h>

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);

Returns: 0 if OK, positive Exxx value on error


   在我们启动一个程序的时候,系统就自动的设置其为单线程,一个名为initial的线程就默认在执行任务了。而在我们自己的程序中,我们则需要显示的调用该函数生成一个新的线程。

   在该函数中,tid返回的是系统为该线程生成的唯一pid标识号。attr是一些我们在生成该线程时希望进行的一些配置,如对于该线程的优先级、私有stack的大小等,一般情况下,我们直接在此以null为参数,表示使用系统默认的配置。fun则表示希望本线程去执行的函数,这个函数的参数智能通过单参数arg来传入,所以如果敢函数原先有多个参数则需要使用结构体将这些参数封装通过arg这单一参数传入。"The thread starts by calling this function and then terminates either explicitly (by callingpthread_exit) or implicitly (by letting the function return)." 

   返回值为0时表示生产该线程成功,其他正值则表示一些错误信息。

pthre

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值