Linux多线程编程

来源:互联网 发布:杭州超市购物软件 编辑:程序博客网 时间:2024/05/28 15:19

什么是进程?

进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。也就是说,每个进程都是一个独立的运行单位拥有各自的权利和责任。其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程。

Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。

“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;

“代码段”存放的是程序代码的数据。

“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。

什么是线程?

线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。

进程与线程的区别: 进程——资源分配的最小单位,线程——程序执行的最小单位;进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径;进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

进程下的函数:

1.pthread_create

函数的作用:创建一个线程

函数原型:pthread_create(pthread_t *thread,pthread_attr_t *attr,(void *) (*start_routine)(void *),(void *)arg);

函数的参数:thread:线程的标识符(指针)

            attr:线程属性,一般为NULL

           start_routine:线程的执行函数,返回值及参数为void *

           arg:从main函数传入到线程执行函数的参数

函数返回值:成功0,出错<0;

头文件:#include<pthread.h>

2.pthread_exit

函数的作用:等待线程的退出

函数的原型:void pthread_exit(void *retval);

3.pthread_join

函数的作用:等待线程的退出

函数原型:pthread_join(pthread_t th,void **thread_return);

函数的参数:th:线程的标识符

           Thread_return:不为NULL时,存储线程结束时的返回值;

函数的返回值:成功0,出错<0

现创建一个多线程:

#include <stdio.h>#include <pthread.h>void *myThread1(void){    int i;    for(i = 0;i < 10;i++)    {        printf("hello hello.\n");        sleep(1);    }}void *myThread2(void){    int i;    for(i = 0;i < 10;i++)    {        printf("world world.\n");        sleep(1);    }}int main(){    int i = 0;    int ret = 0;    pthread_t id1,id2;    ret = pthread_create(&id1,NULL,(void *)myThread1,NULL);    if(ret)    {        printf("creat pthread error!\n");        return 1;    }    ret = pthread_create(&id2,NULL,(void *)myThread2,NULL);    if(ret)    {        printf("creat pthread error!\n");        return 1;    }    pthread_join(id1,NULL);    pthread_join(id2,NULL);        return 0;}

若实行传参,可将程序作以下修改:

#include <stdio.h>#include <pthread.h>void *myThread1(int *count){    int i;       for(i = 0;i < (*count);i++)    {        printf("hello hello.\n");        sleep(1);    }}void *myThread2(void){    int i;    for(i = 0;i < 10;i++)    {        printf("world world.\n");        sleep(1);    }}int main(){    int i = 0;    int count = 5;    int ret = 0;    pthread_t id1,id2;    ret = pthread_create(&id1,NULL,(void *)myThread1,&count);    if(ret)    {        printf("creat pthread error!\n");        return 0;    }    ret = pthread_create(&id2,NULL,(void *)myThread2,NULL);    if(ret)    {        printf("creat pthread error!\n");        return 0;    }    pthread_join(id1,NULL);    pthread_join(id2,NULL);        return 0;}

创建一个结构体线程如下:

#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <string.h>struct member{    int a;    char s[100];};void *create(void *arg){    struct member *temp;    temp = (struct member *)arg;    printf("member->a = %d\n",temp->a);    printf("member->s = %s\n",temp->s);    return (void *)8;}int main(int argc,char *argv[]){    pthread_t id;    int error;    int num;    struct member *b;    b = (struct member *)malloc(sizeof(struct member));    b->a = 4;    strcpy(b->s,"hello");    error = pthread_create(&id,NULL,create,(void *)b);    if(error)    {        printf("pthread is not created\n");        return -1;           }    sleep(1);    printf("pthread is created\n");    pthread_join(id, (void *)*num);    printf("the return num is %d\n",num);    return 0;}


 

 

 

 

 


0 0
原创粉丝点击