LINUX C系统编程学习笔记-----------多线程编程

多线程

多线程线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约   CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。 

 

Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。 

 

用到的头文件 pthread.h    库 libpthread.a

 

创建线程

int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, viod *(* start_rtn) (void), void *arg); 

tidp:线程id

attr:线程属性(一般为空)

start_rtn:线程要执行的函数

arg:start_rtn的参数

编译时:gcc filename -lpthread

 

终止进程

线程的正常退出方式:

(1).线程从启动例程中返回

(2).线程可以被另一个进程终止

(3).线程自己调用pthread_exit函数

void pthread_exit(void *rval_ptr); //终止调用线程

rval_ptr:线程退出返回值的指针 

线程等待 

int pthread_jion(pthread_t tid,void **rval_ptr);

阻塞调用进程,直到指定的线程终止

tid:等待退出的线程id

rval_ptr:线程退出的返回值的指针

线程标识 

pthread_t pthread_self(void);

获取调用线程的自身id

 

清除 

如果发现某段程序线程会中止(包括pthread_exit函数,但不包括return),用pthread_cleanup_push和pthread_cleanup_pop把它包围起来 。

vod pthread_cleanup_push (viod(*rtn) (void *),void *arg);

将清除函数压入清除栈

rtn:清除函数

arg:清除函数的参数

void pthread_cleanup_pop(int execute);

将清除函数弹出清除栈

execute执行到pop时是否在弹出清理函数的 同时执行该函数,非0,执行,0则不执行。

例: 

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *clean(void *arg)
{
    printf("cleanup:%s \n",(char *)arg);
    return (void *)0;
}
void *thr_fn1(void *arg)
{
    printf("thread 1 start\n");
    pthread_cleanup_push((void *)clean,"thread 1 first handler");//运用清除函数
    pthread_cleanup_push((void *)clean,"thread 1 second handler");
    printf("thread 1 push complete\n");
    if (arg)
    {
        return((void *)1);
    }
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    return (void *)1;
}
void *thr_fn2(void *arg)
{
    printf("thread 2 start \n");
    pthread_cleanup_push((void *)clean,"thread 2 first handler");
    pthread_cleanup_push((void *)clean,"thread 2 second handler");
    printf("thread 2 push complete\n");
    if (arg)
    {
        return((void *)2);
    }
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    return (void *)2;
}
int main(void)
{
    int err;
    pthread_t tid1,tid2;
    void *tret;
    err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);//创建线程1
    if (err != 0 )
    {
        printf("error.....\n");
        return -1;
    }
    err = pthread_create(&tid2,NULL,thr_fn2,(void *)1);//创建线程2
    if (err != 0)
    {
        printf("error.....\n");
        return -1;
    }
    err = pthread_join(tid1,&tret);//线程1等待
    if (err != 0)
    {
        printf("error.....\n");
        return -1;
    }
    printf("pthread 1 exit code %d \n",(int) tret);
}


 

 

 

 

 

posted @ 2012-07-09 22:28  xss  阅读(727)  评论(0编辑  收藏  举报