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已经结束
- linux多线程的使用
- linux多线程的使用
- linux下 多线程的使用
- linux 多线程和同步机制的使用
- linux 多线程和同步机制的使用
- linux 多线程编程 ---- 信号量的使用
- linux下使用多线程的注意事项
- linux 多线程和同步机制的使用
- linux 多线程中定时器的使用
- linux 多线程编程---- 信号量的使用
- linux 多线程中定时器的使用
- 多线程使用linux时间函数的方法
- linux多线程【7】mmap的使用
- Linux多线程信号量的概念和使用
- linux程序多线程互斥锁的简单使用
- linux下多线程的使用 pthread_create()
- linux多线程互斥锁的简单使用
- 多线程使用linux时间函数的方法
- 递归搜索 ( 水题 )——A Rational Sequence ( UVA 7363 )
- 百度H5怎么做
- HDOJ 5747 Aaronson
- 杭电OJ2203-亲和串
- EL表达式/ JSTL标准标签库
- linux多线程的使用
- 栈区和堆区内存分配的区别
- 链表实现冒泡排序
- [源码学习][知了开发]WebMagic四大组件-Scheduler
- STL set容器 基本运用
- 不可思议、违反直觉
- (三)Spring框架——IoC容器
- TCP UDP及socket编程学习(一)
- RMQ (st表) Balanced Lineup