linux多线程的使用

来源:互联网 发布:如何防范网络诈骗ppt 编辑:程序博客网 时间:2024/06/05 08:27

1. 带你了解多线程:

线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。
使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

2. 感觉理论的东西还是太枯燥了,抓狂赶紧上代码大笑

#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include <string.h>#define MAX 10pthread_t thread[2];pthread_mutex_t mut;int number=0, i;void *thread1(){        printf ("thread1 : I'm thread 1\n");        for (i = 0; i < MAX; i++)        {                printf("thread1 : number = %d\n",number);                pthread_mutex_lock(&mut);                        number++;                pthread_mutex_unlock(&mut);                sleep(2);        }        printf("thread1 :主函数在等我完成任务吗?\n");        pthread_exit(NULL);}void *thread2(){        printf("thread2 : I'm thread 2\n");        for (i = 0; i < MAX; i++)        {                printf("thread2 : number = %d\n",number);                pthread_mutex_lock(&mut);                        number++;                pthread_mutex_unlock(&mut);                sleep(3);        }        printf("thread2 :主函数在等我完成任务吗?\n");        pthread_exit(NULL); //终止线程}void thread_create(void){        int temp;        memset(&thread, 0, sizeof(thread));                 /*创建线程*/        if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)  //创建线程1                 printf("线程1创建失败!\n");        else                printf("线程1被创建\n");        if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0)  //创建线程2                printf("线程2创建失败");        else                printf("线程2被创建\n");}void thread_wait(void){        /*等待线程结束*/        if(thread[0] !=0) {                                   pthread_join(thread[0],NULL);//以阻塞的方式等待线程1的结束                printf("线程1已经结束\n");        }        if(thread[1] !=0) {                                pthread_join(thread[1],NULL);//以阻塞的方式等待线程2的结束                printf("线程2已经结束\n");        }}int main(){        /*用默认属性初始化互斥锁*/        pthread_mutex_init(&mut,NULL);        printf("我是主函数哦,我正在创建线程,呵呵\n");        thread_create();        printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");        thread_wait();        return 0;}
3 执行结果如下:

root@ubuntu:/home/newdevice# ./pthread_test 
我是主函数哦,我正在创建线程,呵呵
线程1被创建
线程2被创建
我是主函数哦,我正在等待线程完成任务阿,呵呵
thread2 : I'm thread 2
thread2 : number = 0
thread1 : I'm thread 1
thread1 : number = 1
thread1 : number = 2
thread2 : number = 3
thread1 : number = 4
thread2 : number = 5
thread1 : number = 6
thread1 : number = 7
thread2 : number = 8
thread1 : number = 9
thread2 : number = 10
thread1 :主函数在等我完成任务吗?
线程1已经结束
thread2 :主函数在等我完成任务吗?
线程2已经结束


0 0