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

网站开发与支付宝端口连接网站后缀cc

网站开发与支付宝端口连接,网站后缀cc,网络营销推广外包平台,wordpress地址 站点地址转自#xff1a;http://blog.csdn.net/sunny04/article/details/46805261 版权声明#xff1a;本文为博主原创文章#xff0c;未经博主允许不得转载。 进程是操作系统的最小资源管理单元#xff0c; 线程是操作系统最小的执行单元。 一个进程可以有多个线程#xff0c; 也… 转自http://blog.csdn.net/sunny04/article/details/46805261 版权声明本文为博主原创文章未经博主允许不得转载。 进程是操作系统的最小资源管理单元 线程是操作系统最小的执行单元。 一个进程可以有多个线程 也就是说多个线程分享进程的资源包括栈区堆区代码区数据区等。 [cpp] view plaincopy sundhlinhaoIPTV:~$ ulimit -a  core file size          (blocks, -c) 0  data seg size           (kbytes, -d) unlimited  scheduling priority             (-e) 0  file size               (blocks, -f) unlimited  pending signals                 (-i) 31675  max locked memory       (kbytes, -l) 64  max memory size         (kbytes, -m) unlimited  open files                      (-n) 1024  pipe size            (512 bytes, -p) 8  POSIX message queues     (bytes, -q) 819200  real-time priority              (-r) 0  stack size              (kbytes, -s) 8192  cpu time               (seconds, -t) unlimited  max user processes              (-u) 31675  virtual memory          (kbytes, -v) unlimited  file locks                      (-x) unlimited     32bit x86机器上面执行ulimit -a的命令 可以看到  stack size              (kbytes, -s) 8192    这是否说明在线程中可以分配8M的局部变量或者说分配7M的局部变量还有1M的空间存储其他的局部变量或者寄存器状态信息例如bp等或者函数压栈信息等 写代码验证如下 [cpp] view plaincopy //test2.cpp  #include iostream  #include string.h  #include pthread.h  #include stdio.h    using namespace std;    void* func(void*a)  {      cout  enter func  endl;       cout  enter func  endl;       int b[1024*1024*2]  {0};   }    int main()  {      int a[1024*1024*3/2]{0};       pthread_t  pthread ;      pthread_create(pthread, NULL, func, NULL);      cout  This is a test  endl;       //pthread_join(pthread, NULL);       return 0;   }   g -g -o test2 test2.cpp -lpthread sundhlinux:~$ gdb test2 GNU gdb (GDB) 7.5-ubuntu Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Type show copying and show warranty for details. This GDB was configured as i686-linux-gnu. For bug reporting instructions, please see: http://www.gnu.org/software/gdb/bugs/... Reading symbols from /home/sundh/test2...done. (gdb) r Starting program: /home/sundh/test2 [Thread debugging using libthread_db enabled] Using host libthread_db library /lib/i386-linux-gnu/libthread_db.so.1. [New Thread 0xb7cc1b40 (LWP 10313)] Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0xb7cc1b40 (LWP 10313)] func (a0x0) at test2.cpp:10 10          cout enter func endl; (gdb) GDB调试结果如上。   main() 函数中分配1.5M的局部变量是不会报错的 但子线程中分配2M的局部变量就会coredump。 可见只能分配不大于2M的局部变量但ulimit -a 查询到的stack size 为8M。 猜想  线程只能分配不大于 1/4 大小的 stack size 给 局部变量 这应该是操作系统的规定。没在网络上面找到相关的文档说明 那我们现在开始验证我们的猜想 通过 ulimit -s命令修改默认的栈大小  下面程序分配5M的局部变量 也就是说线程栈的大小要 20M(5M*4) [cpp] view plaincopy //test1.cpp  #include iostream  #include string.h  #include pthread.h  #include stdio.h    using namespace std;    void* func(void*a)  {      cout  enter func  endl;       cout  enter func  endl;       int b[1024*1024*5]  {0};   }    int main()  {      int a[1024*1024*5]{0};       pthread_t  pthread ;      pthread_create(pthread, NULL, func, NULL);      cout  This is a test  endl;       //pthread_join(pthread, NULL);       return 0;   }   ulimit -s 21504 (也就是21M) , 把默认的stack size设置为21M sundhlinux:~ulimit−s21504sundhlinux: ulimit−s21504sundhlinux:  g -g -o test2 test2.cpp -lpthread sundhlinux:~$ ./test2 This is a testenter func enter func 可以成功运行 验证了我们的猜想。 ulimit -s 修改 stack size 也可以通过 pthread_attr_setstacksize() 来修改。 使用ulimit的一个后果就是它会影响到同一环境同一shell或者终端下后续启动的所有程序如果修改成启动时设置的话就会影响到整个系统。 所以大部分情况下还是使用pthread_attr_setstacksize() 代码如下 [cpp] view plaincopy #include pthread.h  #include string.h  #include stdio.h  #include stdlib.h  #include unistd.h  #include errno.h  #include ctype.h    #define handle_error_en(en, msg) \          do { errno  en; perror(msg); exit(EXIT_FAILURE); } while (0)     #define handle_error(msg) \          do { perror(msg); exit(EXIT_FAILURE); } while (0)     struct thread_info {    /* Used as argument to thread_start() */      pthread_t thread_id;        /* ID returned by pthread_create() */       int       thread_num;       /* Application-defined thread # */       char     *argv_string;      /* From command-line argument */   };    /* Thread start function: display address near top of our stack,    and return upper-cased copy of argv_string */    static void *  thread_start(void *arg)   {      struct thread_info *tinfo  arg;       char *uargv, *p;          span stylecolor:#FF0000;int a[1024*1024*5]  {0};/span    printf(Thread %d: top of stack near %p; argv_string%s\n,               tinfo-thread_num, p, tinfo-argv_string);       uargv  strdup(tinfo-argv_string);      if (uargv  NULL)           handle_error(strdup);        for (p  uargv; *p ! \0; p)           *p  toupper(*p);       return uargv;   }    int  main(int argc, char *argv[])   {      int s, tnum, opt, num_threads;       struct thread_info *tinfo;       pthread_attr_t attr;      int stack_size;       void *res;        /* The -s option specifies a stack size for our threads */        stack_size  -1;      while ((opt  getopt(argc, argv, s:)) ! -1) {           switch (opt) {           case s:               stack_size  strtoul(optarg, NULL, 0);              break;            default:               fprintf(stderr, Usage: %s [-s stack-size] arg...\n,                       argv[0]);              exit(EXIT_FAILURE);          }      }       num_threads  argc - optind;       /* Initialize thread creation attributes */        s  pthread_attr_init(attr);      if (s ! 0)           handle_error_en(s, pthread_attr_init);        if (stack_size  0) {           s  span stylecolor:#FF0000;pthread_attr_setstacksize/span(attr, stack_size);           if (s ! 0)               handle_error_en(s, pthread_attr_setstacksize);       }       /* Allocate memory for pthread_create() arguments */        tinfo  calloc(num_threads, sizeof(struct thread_info));       if (tinfo  NULL)           handle_error(calloc);        /* Create one thread for each command-line argument */        for (tnum  0; tnum  num_threads; tnum) {           tinfo[tnum].thread_num  tnum  1;          tinfo[tnum].argv_string  argv[optind  tnum];           /* The pthread_create() call stores the thread ID into             corresponding element of tinfo[] */           s  pthread_create(tinfo[tnum].thread_id, attr,                             thread_start, tinfo[tnum]);          if (s ! 0)               handle_error_en(s, pthread_create);       }       /* Destroy the thread attributes object, since it is no         longer needed */       s  pthread_attr_destroy(attr);      if (s ! 0)           handle_error_en(s, pthread_attr_destroy);        /* Now join with each thread, and display its returned value */        for (tnum  0; tnum  num_threads; tnum) {           s  pthread_join(tinfo[tnum].thread_id, res);          if (s ! 0)               handle_error_en(s, pthread_join);            printf(Joined with thread %d; returned value was %s\n,                   tinfo[tnum].thread_num, (char *) res);           free(res);      /* Free memory allocated by thread */       }       free(tinfo);      exit(EXIT_SUCCESS);  }   $ ./a.out -s 0x1600000 hola salut servus   (0x1500000  20M0x160000021M   Thread 1: top of stack near 0xb7d723b8; argv_stringhola Thread 2: top of stack near 0xb7c713b8; argv_stringsalut Thread 3: top of stack near 0xb7b703b8; argv_stringservus Joined with thread 1; returned value was HOLA Joined with thread 2; returned value was SALUT Joined with thread 3; returned value was SERVUS 程序可以正常运行。 这里需要注意的一点是主线程还是使用系统默认的stack size也即8M 不能在main() 里面声明超过2M的局部变量创建子线程的时候调用了pthread_attr_setstacksize(), 修改stack size为21M然后就能在子线程中声明5M的局部变量了。 本文转自张昺华-sky博客园博客原文链接http://www.cnblogs.com/sky-heaven/p/7654950.html如需转载请自行联系原作者
http://wiki.neutronadmin.com/news/164946/

相关文章:

  • 用闲置的安卓手机做网站服务器如何做测评视频网站
  • 产品展示网站含后台网站模板下载兰州建设工程信息网站
  • 安阳网站建设开发建筑模拟2015
  • 网站建设项目设计报告m开头的网站建设公司
  • 如何加强门户网站建设电商网站首页模板
  • 安庆网站开发人员网站建设的基本步骤
  • 网络公司给别人做网站的cms是买的授权么口碑营销的重要性
  • 珠海专业的免费建站网站ftp用户名和密码
  • 简述网站开发的步骤工程公司排名
  • 廊坊网站关键词优化做阀门网站电话号码
  • 无锡手机网站推广软文是什么
  • 怎么做外语网站推广怎么做
  • dz网站建设教程深圳做网站那家公司好
  • 正规网站建设代理淄博网站建设报价
  • 门户网站和微网站的区别徐州网
  • 建个人网站怎么赚钱吗多语言网站开发
  • 八爪鱼网络网站建设wordpress博客样板
  • 南宁网站建设费用wordpress 一键转微信
  • 网站海外推广平台罗湖田贝社区网站建设
  • 杭州上城区网站建设免费的建站平台
  • 360网站推广怎么做页面设计合同
  • 厦门物流网站建设西安企业做网站
  • 我本沉默传奇新开网站自适应网站的图做多大 怎么切
  • 如何快速提升网站关键词排名网络营销公司推荐
  • 网站代备案管理系统东昌网站建设
  • 站长统计windows怎么做网站
  • 云谷系统网站开发网站服务器租赁多少钱
  • php网站开发实训实践总结红酒营销型网站建设
  • 石家庄企业建站手机网站主机
  • 企业网站源码cms注册安全工程师官网