当前位置: 首页 > news >正文

上传图片分享链接/青岛百度推广优化怎么做的

上传图片分享链接,青岛百度推广优化怎么做的,广州天成网络技术有限公司,深圳龙岗房价本文主要研究下linux中多线程的用法。在之前的几篇文章中,介绍过Linux中多进程的实现,现在我们开始研究下linux中的多线程。之前曾经实现过多进程的linux服务器,解决了多客户端连接时的效率问题,但是它还存在以下问题:…
本文主要研究下linux中多线程的用法。
        在之前的几篇文章中,介绍过Linux中多进程的实现,现在我们开始研究下linux中的多线程。之前曾经实现过多进程的linux服务器,解决了多客户端连接时的效率问题,但是它还存在以下问题:
1、创建子进程时,需要完全复制父进程的内存,造成很大的性能开销。
2、由于各个进程之间不属于同一片内存,进程间通信需要特殊的IPC技术
3、CPU在执行进程的代码时,需要进行上下文切换(将原进程的上下文数据从内存拷贝出去备份,然后拷贝进新进程的上下文到内存),而且这种切换的频率很高,每秒钟上百次甚至上千次,造成了很大的性能开销。

        多线程的提出,就是为了最大限度的减少上述问题,进程可以理解为构成操作系统的程序执行流,而线程可以理解为构成进程的程序执行流,有了多线程:
1、创建子线程时不必完全的赋值进程的内存
2、线程间共享数据区和堆区,不必采用特殊的IPC技术进行线程间的通信
3、最主要一点,线程间进行在切换时不需要进行上下文的切换。

        下面,给出linux中创建线程的函数原型:
#include <pthread.h>
int pthread_create(pthread_t * restrict thread, const pthread_attr_t * restrict attr,
void *(*start_routine) (void *), void * restrict arg);

thread -- 用来保存创建的进程的进程ID。
attr -- 用来设置进程的属性,通常情况下传入NULL即可
start_routine -- 线程主函数的函数指针,每个线程都有自己的main函数,这里的start_routine就是线程main函数的函数指针。
arg -- 传递给线程的参数的指针

        大家注意到了,在thread等参数的前面都有一个restrict关键字进行修饰,restrict的意思是告诉编译器,该指针或者引用所指的变量只能由该指针或者引用进行修改,无法通过其他方式进行修改。下面,我们先研究下restrict的用法和作用,首先先看下面的例子:

#include<stdio.h>
int main()
{
int i=0;
int* restrict pi=&i;
int* pi1 = &i;
*pi1 = 1;
printf("i=%d\n",i);
}

        这是我刚刚接触到restrict时,想要验证restrict功能的代码,以我最初的理解,restrict既然是告诉编译器,该指针指向的变量只能通过该指针进行修改,那么在代码中我通过pi1进行修改i的值时,编译器一定会报错,
        但是结果是不是这样呢,请看下面的运行过程(编译时需要加上 -std=c99的编译选项,因为从c99开始才支持对restrict的支持):
[Hyman@Hyman-PC retrictts]$ gcc restrictts.c -std=c99
[Hyman@Hyman-PC retrictts]$ ./a.out 
i=1
        程序非但没有报错,反而得到了正确的运行结果?这是怎么回事?

        原来restrict只是针对编译器的一个优化策略,它告诉编译器,因为没有别的指针指向该变量,在编译阶段就计算出该变量的值然后在所有使用该变量的地方进行代码合并,比如有两段代码:

*pi+=2;

*pi+=5;

 将会被合并为

pi+=7

至于是不是针对只有该指针指向这个变量这个需要程序员自己去控制,就像这是一个规则,但是尊不遵守规则,那是你自己的事情了。

        简单介绍了下restrict关键字,我们继续进行多线程的讨论。先举例介绍多线程的使用方法:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void pthread_main(int* pmax)
{
int i=0;
for(i=0;i<*pmax;i++)
{
puts("child thread called ...");
sleep(1);
}
}
int main()
{
pthread_t ptid;
int i=10;
if(pthread_create(&ptid,NULL,(void*)pthread_main,(void*)&i) != 0)
{
puts("pthread_create() error");
exit(1);
}
sleep(11);
return 0;
}

第17行,我们利用pthread_create()函数创建了一个线程,进程函数为pthread_main,函数参数通过pthread_create中最后一个参数进行传递,在线程函数中打印字符串hild thread called ...,总的打印次数按照传过来的线程参数决定。
第22行,程序sleep了11秒,主要目的是为了等待子线程运行结束,给子线程的运行准备充足的时间。

运行结果如下(请注意编译时,需要添加-lpthread选项):

[Hyman@Hyman-PC retrictts]$ gcc restrictts.c -lpthread
[Hyman@Hyman-PC retrictts]$ ./a.out 
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...
child thread called ...

Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
Git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL34



























http://www.jmfq.cn/news/5096215.html

相关文章:

  • 建站时长是什么原因造成的/被代运营骗了去哪投诉
  • 网站建设 骏域网站建设专家/如何引流客源最快的方法
  • 电子商务网站网络安全设计方案/英文谷歌优化
  • 泰来县城乡建设局网站/app推广代理
  • 梧州做网站的公司/百度指数数据下载
  • 衡水seo网站建设优化排名/网站维护的主要内容
  • 网站建设广告词/百度推广账户登录
  • 上海网站建设公司 珍岛/百度公司总部
  • 德州聊城网站建设/seo的优化步骤
  • 湖南网站建设公司/如何建立网页
  • 怎样做吓人网站/企业推广文案范文
  • 布吉做棋牌网站建设哪家便宜/广告投放平台
  • 阿里云备案多个网站/网络推广方法有几种
  • 中国国建设监理协会网站/网络排名优化软件
  • WordPress文章数据转emlog/佛山快速排名seo
  • 建设信源网站/semikron
  • 下载app 的网站 如何做/百度手机端排名如何优化
  • 南县做网站推荐/重庆seo排名软件
  • 有没有专门做联谊的网站/seo优化技术厂家
  • 建设银行嘉兴分行网站首页/新产品怎样推广
  • 昆明做鸭子社交网站/做互联网推广的公司
  • 软件开发建设网站/百度培训
  • 公司网站建站/网站建设方案开发
  • 北京商城型网站建设/百度推广运营怎么做
  • 坂田网站建设流程/佛山百度提升优化
  • 有公网ip 如何做一网站/今日国际新闻最新消息
  • 做网站建设分哪些类型/推广引流的10个渠道
  • 企业微信app官网下载地址/seo网络推广优势
  • 网站设计要素 优帮云/模板建站的网站
  • wordpress网站如何迁移/品牌营销推广要怎么做