您的位置:首页 > 其它

轻量级的进程--线程

2014-09-01 20:44 169 查看

1.为什么有了进程还要有线程?

1.在linux操作系统下,启动一个新的进程必须分配给它独立的地址空间,虚拟地址空间。每个都一样,在虚拟存储器那一节已经学过,并且建立众多的数据表来维护它的代码段,堆栈段和数据段,开销太大了,确实如果都这样工作的话32位的机器每个进程分配4G虚拟空间,进程多了去了,磁盘根本就不够,所以我猜想过一定是通过其他方面进行优化了。
运行于一个进程的多个线程,彼此之间使用相同的地址空间,共享大部分数据,而且启动一个线程所花费的时间远远小于启动一个进程。

2.另一个原因不同的进程间的通信只能通过通信的方式进行,不仅费时,而且很不方便。同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他进程所用,快捷,方便,但是也有安全隐患,有的变量不能同时被两个线程所修改。

线程有以下优点:

1.提高系统的响应速度,对图形界面来说很有意义,当一个操作耗时间太长,整个系统都在等待这个操作,此时程序不会响应键盘,鼠标菜单的操作,而使用多进程技术,将耗时很长的操作置于一个新的线程,避免这种尴尬情况。
2.使多CPU系统更加有效,操作系统会保证当线程的数目不大于CPU的数目的时候,不同的线程运行在不同的CPU上。
3.改善程序结构,一个既长又复杂的进程可以考虑分成多个线程,成为几个独立或者半独立的部分,原来的银行取款机模拟流程的程序可以优化下。

2.线程编程注意事项和案例

linux操作系统线程操作函数需要用到进程相关的库,不是标准的C语言库,使用的时候要引用pthread.h文件,还要在编译链接时候要使用 -lpthred 选项,表示链接库目录下的库文件,否则编译不过去,提示错误,还需要2.0版本以上的Linux内核
#include <stdio.h>
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
char buffer[]="hello world";
//线程执行函数
void thread_function(void *arg)
{
int i;
printf("New thread is running,arguement is %s\n",(char *)arg);
strcpy(buffer,"Bye!");
pthread_exit("this is exit signal");//线程退出,并且返回一句话

}

int main()
{
pthread_t tid;
int ret;//保存调用结果
void *thread_result;
//创建新的线程,线程号存在tid,执行上面的函数
if((ret=pthread_create(&tid,NULL,(void *)thread_function,(void *)buffer))!=0)
{
perror("pthread_creat");
exit(1);
}
printf("Main thread is running \n");
printf("before new thread buff is %s \n",buffer);//打印信息,
//线程没有进程那种可以等待很多进程退出的函数,只有一个等待另一个
ret=pthread_join(tid,&thread_result);//等待线程退出,并将返回参数传递给thread_result指针
if(ret!=0)
{
printf("thread join error!\n");
}
printf("main waiting new thread.it returns %s\n",(char*)thread_result);
printf("new thread returned,now the buffer is %s\n",buffer);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: