建立一个网站大约要多少钱个人工作室和公司区别

news/2025/9/22 21:35:25/文章来源:
建立一个网站大约要多少钱,个人工作室和公司区别,wordpress营销模板下载,免费信息推广网站前言 在上一篇文章中我们介绍了在计算机底层视角下的虚拟内存和操作系统在用户层所进行的各个分层#xff0c;在这篇文章我们就要开始尝试书写多线程代码了,其实在c11后c就提供供了线程类给我们使用,c线程类其实主要是对c操作多线程的函数进行了封装#xff0c;本质上其实是…前言 在上一篇文章中我们介绍了在计算机底层视角下的虚拟内存和操作系统在用户层所进行的各个分层在这篇文章我们就要开始尝试书写多线程代码了,其实在c11后c就提供供了线程类给我们使用,c线程类其实主要是对c操作多线程的函数进行了封装本质上其实是一致的所以在讲解我们cpp的多线程编写之前我觉得先来了解一下C语言是如何实现多线程的编写的这样可以让我们更好的去理解cpp线程类的工作原理话不多说发车发车 线程的创建 在之前我们讲解Linux下的进程控制时说过我们在创建进程时进程都会有自己的进程编号pid,而线程和它们一样每一个线程都有唯一的线程编号,它的类型为pthread_t,它是一个无符号长整形数,我们可以调用下面这个函数来获取当前线程的线程编号: pthread_t ptread_self(void); //返回当前线程的线程编号如果我们希望在一个进程中创建子线程,就要调用线程创建函数,但是和进程不同,我们必须要给每一个线程指定一个线程处理函数否则线程将无法正常工作,处理函数的定义如下: int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);参数: thread: 传出参数是无符号长整形数线程创建成功, 会将线程ID写入到这个指针指向的内存中attr: 线程的属性, 一般情况下使用默认属性即可, 写NULLstart_routine: 函数指针创建出的子线程的处理动作也就是该函数在子线程中执行。arg: 作为实参传递到 start_routine 指针指向的函数内部 返回值线程创建成功返回0创建失败返回对应的错误号 下面我们来看一个线程创建的实例: #includestdio.h #includestdlib.h #includeunistd.h #includestring.h #include pthread.h// 线程的处理函数 void* work(void* arg) {printf(子线程id%ld\n,pthread_self());for(int i0;i9;i){printf(child id%d\n,i);}return NULL; }int main(int argc,char* argv[]) {pthread_t tid;pthread_create(tid,NULL,work,NULL);printf(主线程id%ld\n,pthread_self());for(int i0;i3;i){printf(main id%d\n,i);}sleep(10);return 0; }注意 我们在Linux下编译该代码要导入线程库。编译命令如下: all: demo1demo1: Create_Thread.cgcc -pthread -o demo1 Create_Thread.c clean:rm -f demo1运行结果如下 rootiZuf6ckztbjhtavfplgp0dZ:~/mylib/cppdemo/Linux系统编程/多线程/threads(c)# ./demo1 主线程id139930484275008 main id0 main id1 main id2 子线程id139930484270848 child id0 child id1 child id2 child id3 child id4 child id5 child id6 child id7 child id8如果我们去除sleep函数的使用我们会发现结果是这样的: 主线程id140150867830592 main id0 main id1 main id2这是因为虚拟地址生存周期是和主线程保持一致的与子线程无关主线程提前结束导致哪怕子线程还没有开始运行程序也自动停止运行了这里的sleep函数所起到的作用主要就是线程同步。 线程的退出 在我们编写多线程代码时如果我们希望让线程退出但是不希望因此导致虚拟地址空间的释放(主线程突出时会释放)这时候我们可以调用线程退出函数这样线程的退出就不会影响其他线程的正常使用了函数定义如下: void pthread_exit(void* retval)- retval线程退出的时候携带的数据当前子线程的主线程会得到该数据。如果不需要使用指定为NULL 下面我们来看一个简单的示例: #include stdio.h #include stdlib.h #include unistd.h #include string.h #include pthread.hvoid* work(void* arg) {sleep(5);printf(子线程运行中,子线程id:%ld\n,pthread_self());\for(int i1;i9;i){printf(id:%d\n,i);if (i6){pthread_exit(NULL);}}return NULL; }int main(int argc,int *argv[]) {pthread_t tid;pthread_create(tid,NULL,work,NULL);printf(主线程运行中,主线程id:%ld\n,pthread_self());for(int i0;i3;i){printf(id:%d\n,i);}pthread_exit(NULL);//主线程退出return 0; }输出结果为: 主线程运行中,主线程id:140161600366400 id:0 id:1 id:2 子线程运行中,子线程id:140161600362240 id:1 id:2 id:3 id:4 id:5 id:6我们可以看到虽然主线程提前推出了但是却并没有影响到子线程的运行。 线程回收 线程回收函数 进程和线程一样子线程退出的时候它的内核资源是由主线程来回收,线程回收的函数是pthread_join(),该函数是阻塞函数当有子线程正在运行,调用该函数会阻塞,直到所有子线程都退出后才能进行子线程资源的回收一次只能回收一个子线程的资源如果我们有多个子线程资源需要回收需要借助循环来完成,函数原型如下: int pthread_join(pthread_t pid,void** retval);参数说明 pid:要被回收的线程编号retval:二级指针,指向一级指针,是一个传出参数 ,一级指针里面储存的是pthread_exit()函数传出的数据如果不需要该数据可以设为NULL返回值线程回收成功返回0回收失败返回错误号。 回收子线程数据的实现方式 在子线程退出的时候可以通过pthread_join函数来将数据传出,我们在回收子线程的同时也可以接收子线程的数据这样的实现方法有很多种下面我们来看下面几种: 备注 导致实现方法多样性的原因 通过上面的介绍我们知道子线程在被回收的时候会将数据写入到一块内存中,然后采纳数传出该内存的地址而非是存储数据本身而传出的参数类型是void*,这个万能指针可以指向任意一块内存也导致了我们可以通过不同的形式来接收子线程数据。 使用子线程栈 在我们接收子线程数据的时候可以通过子线程栈来回收子线程数据示例代码如下: #include stdio.h #include stdlib.h #include unistd.h #include string.h #include pthread.htypedef struct Person {int id;char* name;int age; }Person;void* work(void* arg) {printf(子线程id:%ld,pthread_self());for(int i0;i9;i){printf(id%d\n,i);if (i6){Person p;p.id1;p.name张三;p.age20;pthread_exit((void*)p);}}return NULL; }int main(int argc,char* argv[]) {pthread_t tid;if (pthread_create(tid,NULL,work,NULL)!0){printf(线程创建失败);return -1;}printf(主线程id:%ld\n,pthread_self());void *ptr;pthread_join(tid,ptr);struct Person* p(struct Person*)ptr;printf(id%d\n,p-id);printf(name%s\n,p-name);printf(age%d\n,p-age);printf(子线程数据成功接收\n);return 0; }我们编译运行后结果如下 主线程id:139934351951680 子线程id:139934351947520id0 id1 id2 id3 id4 id5 id6 id0 name age22476544 子线程数据成功接收我们可以发现在主线程中并没有子线程的数据这是因为当子线程退出时子线程所占据的栈区就会被回收进而导致了子线程想要传递的数据被释放掉了所以说我们一般不会采取子线程栈来接收数据而是使用其他方式来接收数据。 2. 使用全局变量 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.htypedef struct Person {int id;char* name;int age; }Person;Person p;void* work(void* arg) {printf(子线程id:%ld,pthread_self());for(int i0;i9;i){printf(id%d\n,i);if (i6){p.id1;p.name张三;p.age20;pthread_exit((void*)p);}}return NULL; }int main(int argc,char* argv[]) {pthread_t tid;if (pthread_create(tid,NULL,work,NULL)!0){printf(线程创建失败);return -1;}printf(主线程id:%ld\n,pthread_self());void *ptr;pthread_join(tid,ptr);struct Person* p(struct Person*)ptr;printf(id%d\n,p-id);printf(name%s\n,p-name);printf(age%d\n,p-age);printf(子线程数据成功接收\n);return 0; }输出结果为: 主线程id:140702000142144 子线程id:140702000137984id0 id1 id2 id3 id4 id5 id6 id1 name张三 age20 子线程数据成功接收使用主线程栈 虽然线程之间有自己的栈空间但是它们彼此之间也可以互相访问而一般主线程都是最后退出的所以我们可以尝试把子线程返回的数据保存到了主线程的栈区内存中。 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.htypedef struct Person {int id;char* name;int age; }Person;void* work(void* arg) {Person *p(Person*)arg;printf(子线程id:%ld,pthread_self());for(int i0;i9;i){printf(id%d\n,i);if (i6){p-id1;p-name张三;p-age20;pthread_exit((void*)p);}}return NULL; }int main(int argc,char* argv[]) {Person p;pthread_t tid;if (pthread_create(tid,NULL,work,p)!0){printf(线程创建失败);return -1;}printf(主线程id:%ld\n,pthread_self());void *ptr;pthread_join(tid,ptr);printf(id%d\n,p.id);printf(name%s\n,p.name);printf(age%d\n,p.age);printf(子线程数据成功接收\n);return 0; }线程分离 在一些情况下程序中的主线程会拥有自己的业务处理流程如果让主线程负责子线程的资源回收那么调用pthread_join函数在子线程全部结束前主线程会一直阻塞这时候我们可使用线程分离函数来将该线程剥离出来调用该函数后子线程会与主线程分离但是这样pthread_join就接收不到子线程资源了线程分离函数定义如下: int pthread_detach(pthread_t id);示例如下: #include stdio.h #include stdlib.h #include unistd.h #include string.h #include pthread.h// 子线程的处理代码 void* working(void* arg) {printf(我是子线程, 线程ID: %ld\n, pthread_self());for(int i0; i9; i){printf(child i: %d\n, i);}return NULL; }int main() {//创建一个子线程pthread_t tid;pthread_create(tid, NULL, working, NULL);printf(子线程创建成功, 线程ID: %ld\n, tid);// 2. 子线程不会执行下边的代码, 主线程执行printf(我是主线程, 线程ID: %ld\n, pthread_self());for(int i0; i3; i){printf(i %d\n, i);}// 设置子线程和主线程分离pthread_detach(tid);// 让主线程自己退出即可pthread_exit(NULL);return 0; }一些其他的线程函数 线程取消 线程取消指的是我们可以在一个线程中调用它来取消另一个线程函数定义如下: int pthread_cancel(pthread_t pid);代码示例如下 #include stdio.h #include stdlib.h #include unistd.h #include string.h #include pthread.h// 子线程的处理代码 void* work(void* arg) {printf(我是子线程, 线程ID: %ld\n, pthread_self());for(int i0; i9; i){sleep(1);printf(child i: %d\n, i);}return NULL; }int main() {//创建一个子线程pthread_t tid;pthread_create(tid, NULL, work, NULL);printf(子线程创建成功, 线程ID: %ld\n, tid);// 2. 子线程不会执行下边的代码, 主线程执行printf(我是主线程, 线程ID: %ld\n, pthread_self());for(int i0; i3; i){sleep(1);printf(i %d\n, i);}// 设置子线程和主线程分离pthread_cancel(tid);// 让主线程自己退出即可pthread_exit(NULL);return 0; }输出如下: 我是主线程, 线程ID: 139763539765056 我是子线程, 线程ID: 139763539760896 i 0 child i: 0 i 1 child i: 1 i 2 child i: 2注意线程的取消分两步 主线程基于线程取消函数发送请求当子线程再次进行系统调用时线程会被取消(没有这一步线程就还存在) 结语 关于C语言库中关于线程的函数介绍到此就告一段落了下一篇文章我们就要开始介绍cpp中一些关于线程的知识了下篇见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:无公网 IP 访问群晖 NAS:神卓 N600 的安全解决方案(附其他方法风险对比)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发与设计结课大作业汽车可以做哪些广告视频网站

一、命名空间概念1、命名空间(name space)名称空间是存放名字的地方。若变量x1,1存放在内存中,命名空间是存放名字x、x与1绑定关系的地方。2、名称空间加载顺序python test.py#1、python解释器先启动,因而首先加载的是:内置名称空…

2025.9.18 总结

T1 就是有一个 dp 是 f i 0/1 0/1 表示有 i 个数,异或和是不是 0,异或和是不是等于最后一个数,然后矩阵加速就没了。 T2 会发现这个东西你可以贪心维护,每次能阔就阔不能阔就退出。然后判一下相邻两个颜色块之间的…

越南文识别技术:将纸质文档和信息快速、准确地转化为可编辑、可检索的数字数据

在数字化浪潮席卷全球的今天,如何将海量的纸质文档和信息快速、准确地转化为可编辑、可检索的数字数据,已成为一项关键挑战。光学字符识别(OCR)技术正是解决这一挑战的核心。作为OCR技术的一个重要分支,越南文识别…

#JAVA作业

1、什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗? 答:用static修饰的方法多为工具类方法、工厂方法等不依赖对象状态的方法;不用static修饰的是实例方…

C#编程练习:使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息控制台打印消息时要有明显停顿感 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

东莞网站建设企业做彩票网站犯法

1.1 屏蔽罩作用 1.1.1 屏蔽电子信号,防止外界的干扰或内部向外的辐射: 一般见于通信类电路PCB,主要一个无线通信产品上有的敏感器件、模拟、数字电路、DCDC电源电路,都需屏蔽隔离,是为了不影响其它电路,也有防止其它电…

天津河西做网站贵吗市场营销手段13种手段

RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边…

中企动力中山分公司网站英文免费注册网站

bigKey的产生 1、使用String存储了大文件的二进制。 2、使用集合没有考虑到数据的规模,或者规模的增长。 3、哈希中冗余了大量键值对。 bigKey问题 1、操作大key时会阻塞线程:redis是单线程。 2、网络阻塞:在网络中占用大量网络流量。 …

建设网站租服务器腾讯企业邮箱怎么注册

近日,力软与重庆科技学院联合推出了为期两周的低代码应用开发培训课程,来自重庆科技学院相关专业的近百名师生参加了此次培训。 融合研学与实践,方能成为当代数字英才。本次培训全程采用线下模式,以“力软低代码平台”为软件开发…

绿色家园网站怎么做wordpress 密码更改

File: rust/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs rust/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs 文件是 Rust 编译器针对 x86_64-unknown-netbsd 目标平台的配置文件。该文件定义了与该平台相关的特性、链接选项、目标特定的运行时支持以…

wordpress制作网站教程视频企业网站建设一般要素

文章目录 Git概述什么是GitGit历史Git是什么 为什么要使用Git什么是版本控制系统 Git和SVN对比SVN集中式SVN优缺点 Git分布式Git优缺点 Git工作流程四个工作区域工作流程 Git下载与安装下载window版下载64位软件包安装Git Git基础环境配置设置用户信息查看配置信息 文件的两种状…

一个空间两个php网站钉钉企业邮箱收费标准

一共8884张图片 xml .txt格式都有 Yolo可直接训练 已跑通 动作类别一共8类。 全部为教室监控真实照片,没有网络爬虫滥竽充数的图片,可直接用来训练。以上图片均一一手工标注,标签格式为VOC格式。适用于YOLO算法、SSD算法等各种目标检测算法…

用asp.net开发网站的优势微信如何建公众号怎么创建

刁钻的顾客 发布时间: 2017年7月3日 10:23 时间限制: 3000ms 内存限制: 128M 描述 XJTU校园内新开一家商店,可是来了一位刁钻的顾客要购买商品A和商品B。关于商品的质量,共有n个评分,每个评分即一个整数来表示该产品在某一方面的质量。商…

23

https://www.luogu.com.cn/problem/P9197 这题我为什么不会啊?? 套路地拆绝对值,从大到小往序列里面插数,\(dp_{i,j,k,0/1,0/1}\) 表示前 \(i\) 个数形成 \(j\) 个连续段,这 \(i\) 个数的贡献总和为 \(k\),是否填…

宁夏微信网站建设广西网站建设企业

关键词: 重叠子问题;每一个状态一定是由上一个状态推导出来(类似数列a^n f(a^n-1,a^n-2)) 步骤: 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目&#…

9.16 总结

这天没考好。 T1 就是你会发现这个距离是一个求和的形式,你要维护绝对值,这很不好。于是你考虑转切比雪夫再用线段树维护就做完了。 T2 这个题就是往行和列之间连边,然后发现可以定向,因此要求出最小生成基环树森林…

Halcon抛出异常日志

Halcon 抛出异常日志 // 捕获Halcon异常并生成格式化的错误日志信息 // 参数说明: // - HDevExpDefaultException:Halcon异常对象引用,包含具体的异常信息 // - functName:发生异常的函数名称,用于日志定位 // - …

计算机网站建设论文.阿里云个人备案可以做企业网站吗

在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库,然后将数据库部署到ECS。 1.安装PHP和MySQL 确保你的Mac上已经安装了PHP和MySQL。你可以使用Homebrew来安装它们: $ brew install php $ brew install mysql 安装mysql完成后记住这一句: …

免费开源网站系统有哪些网站解析加速

在vue项目中&#xff0c;使用elementui 框架&#xff0c;做一个后台管理系统 在写左边菜单&#xff0c;菜用了&#xff0c;elementui 提供的组件 &#xff0c; el-menu 组件。但是组件没有链接&#xff0c;而我们知道添加链接使用router-link标签代码如下&#xff1a; <el-…