linux C 线程编程

/**********************************************************************/
线程
/**********************************************************************/
 在嵌入式 Linux 中,pthread 线程库是一套通用的线程库,遵循 POSIX 规范,具有很好的可移植性。
   

线程主要包括以下几个步骤:
        1.创建线程。这个步骤实际上就是指定线程所要执行的函数,使用的函数是 pthread_create。
        2.调用相关线程函数。在线程创建以后,就开始运行相关的线程函数。
        3.线程退出。在线程调用函数运行完之后,该线程也就自动结束来。另一种退出线程的方法是使用函数 pthread_exit,这是线程的主动行为。
    
       ( 注意:在使用线程函数时,不能随意使用 exit 退出函数进行出错处理,由于 exit 的作用是使调用进程终止,往往一个进程包含多个线程,因此,在使用 exit 之后,该进程中的所有线程都会终止。因此,在线程中应该使用 pthread_exit 来代替 exit。按照POSIX标准定义,当主线程在子线程终止之前调用pthread_exit()时,子线程是不会退出的。这里在main函数中调用pthread_exit()只会是主线程退出,而进程并未退出。因此新线程继续执行而没有退出。)
    
        4.线程资源回收。由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放。正如进程之间可以用 wait 系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是 pthread_join 函数。
         pthread_join 可以用于将当前主线程挂起,等待子线程的结束。调用它的线程将一直阻塞直到指定的线程结束为止。

编译时注意:

        因为pthread并非Linux系统的默认库,而是POSIX线程库。在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显式链接该库。函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使 用perror()打印错误信息。

        pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以线程函数在编译时,需要连接库函数,如    gcc pthread_create.c -o pthread_create -lpthread


/**********************************************************************pthread_create函数**********************************************************************/

    原型:int  pthread_create((pthread_t  *thread,  pthread_attr_t  *attr,  void  *(*start_routine)(void  *),  void  *arg)

    用法:#include  <pthread.h>

    功能:创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。

    说明:thread:线程标识符;

              attr:线程属性设置;

              start_routine:线程函数的起始地址;

              arg:传递给start_routine的参数;

              返回值:成功,返回0;出错,返回-1。


/**********************************************************************pthread_exit函数**********************************************************************/

    原型:void  pthread_exit(void  *retval)

    用法:#include  <pthread.h>

    功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数来同步并释放资源。

    说明:retval:pthread_exit()调用线程的返回值,可由其他函数如pthread_join来检索获取。pthread_exit函数唯一的参数value_ptr是函数的返回代码,只要pthread_join中的第二个参数value_ptr不是NULL,这个值将被传递给value_ptr。

    备注:线程的终止可以是调用了pthread_exit或者该线程的例程结束。也就是说,一个线程可以隐式的退出,也可以显式的调用pthread_exit函数来退出。


/**********************************************************************pthread_join函数**********************************************************************/

头文件 : #include <pthread.h>

函数定义: int pthread_join(pthread_t thread, void **retval);

描述 :pthread_join() 函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :

        thread: 线程标识符,即线程ID,标识唯一线程。

        retval: 用户定义的指针,用来存储被等待线程的返回值。

返回值 : 0代表成功。 失败,返回的则是错误号。

备注:

         (1).Linux中,默认情况下是在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设置Threads attributes来设置当一个线程结束时,直接回收此线程所占用的系统资源,详细资料查看Threads attributes。其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。不过这个copy过程和fork不一样。 copy后的进程和原先的进程共享了所有的变量,运行环境。这样,原先进程中的变量变动在copy后的进程中便能体现出来。

          (2).pthread_join使一个线程等待另一个线程结束。代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。

          (3).所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。

          (4).调用pthread_join的线程将被挂起直到参数thread所代表的线程终止时为止。pthread_join是一个线程阻塞函数,调用它的函数将一直等到被等待的线程结束为止。







转载于:https://my.oschina.net/fengyeshangqing/blog/337758

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值