网站续费多少钱wordpress显示所有文章列表

diannao/2026/1/18 8:13:40/文章来源:
网站续费多少钱,wordpress显示所有文章列表,搭建小程序需要准备什么,网站备案有哪些费用linux多线程自己从接触很久也有不少实践#xff0c;但总是觉得理解不够深刻#xff0c;不够系统。借这篇文章试着再次系统学习一下linux多线程编程#xff0c;理解编程的concept#xff0c;细致看一下POSIX pthread API的实现。还是凭借强大的google search#xff0c;找到…linux多线程自己从接触很久也有不少实践但总是觉得理解不够深刻不够系统。借这篇文章试着再次系统学习一下linux多线程编程理解编程的concept细致看一下POSIX pthread API的实现。还是凭借强大的google search找到几篇不错的文章和教程附在最后。我在这篇文章中的总结大多都是基于这些材料的学习和自己实践经验的一点总结。Thread基本知识Process 地址空间Thread附着在process内部先看一下process在CPU上是个什么样的吧。启动一个linux processOS会开辟一块内存用来装载code保存data和process状态。看一下进程的地址空间。根据访问权限进程地址空间分为user space和kernel space。32bit系统中高1G为kernel space低3G为user space具体划分为Process control block(从高1G kernel space中分配)stackmemory mapping segmentheapbss and datatext1G的kernel space是这台机器上所有processes共享的每个进程的PCB存在这个空间中一般应用程序是没有办法直接访问修改的但是kernel 通过/proc 提供给应用程序一个接口可以查看PCB的信息部分内容还可以修改详细可以看一下/proc。剩下的stack/heap/text/...都驻留在process user space是属于process私有空间。详细的kernel如何管理进程memory还可以再开一篇。Thread是什么process是个重型的运行实体以process为单位切分任务和调度os的开销太大了。我们可以把process这个单位再切小些thread的概念就诞生了。好我们来看一下怎样把这个单位切小的。简单来讲thread共享大部分的process的内容只维护必需的一小部分作为私有内容。Thread自己维护的私有内容Kernel spaceStack pointerRegistersScheduling properties (such as policy or priority)Set of pending and blocked signalsThread specific data.User spacestack其他诸如PCB中进程信息用户空间中的text/data/heap/...都是同一个process下所有Threads共享的。有了这些thread自己私有的信息os就可以以thread为单位去调度了。因为它是轻量级的所以相比processthread一般具有更好的性能更快的响应速度。但是thread的稳定性和编程复杂度要比process差些要考虑的内容比较多。Threads通信和同步正因为同一个process内的threads间天然共享了大量的内存thread间的信息交互要比较高效同时也增加了复杂度总要处理好共享内存间的互斥。当然process间也可以共享内存比如通过进程父子关系或者通过/dev/shm mmap特定物理内存到进程空间内或者其他。线程间通信所有的IPC(inter process communication)方法都适用于thread间的通信。比较全的IPC总结可以参考IPC。比较常用的我们会涉及到message queuesharememorysemaphoresocketsignal等。semaphore是共享资源互斥的方法其他都是冗余的方式进行通信。互斥是个比较复杂的话题我们单开一节讨论一下。共享资源的互斥为什么要保护共享资源做互斥访问这里不罗嗦了。通过对共享资源(临界区)加锁可以实现互斥访问互斥锁(mutex)也有多种类型。simple blocking一方拿到临界区锁后其它人再来拿锁都会挂起。Recursive(递归型)允许锁的拥有者多次申请锁而不被挂起对递归调用有用。Reader/Writer允许多个reader同时share读锁如果有reader在读writer申请锁会block直到所有reader释放。可以理解为一写多读写时互斥。这种锁有写饿死的风险。其中POSIX的pthread库支持recursive和reader/writer类型的锁。共享访问带来的风险和挑战共享访问中有写操作必然要考虑互斥。互斥有风险使用需谨慎。如果你最终不可避免的要使用互斥锁要关注互斥锁的这些风险。deadlock(死锁)死锁一般发生在双方或者多方在申请两个以上的互斥锁然后大家各拿了部分互不相让。开发者要尽量避免这种编程场景发生如果真的需要可以编程要么同时获得要么一个都不要做人要有骨气race condition(竞争条件)共享资源在没有互斥机制保护时由于线程调度的不确定性会导致共享的资源变化无序无规律程序的输出也就不确定了。共享资源无互斥保护线程间竞争访问输出无法保证。这要求开发者要特别小心识别出程序中的那些共享资源加锁保护。尤其是第三方的开源软件多线程调用时要注意是否是线程安全的。priority reversion(优先级反转)优先级反转是个很有意思的问题尤其是在嵌入式实时OS上进程/线程的调度是抢占式的高优先级的任务ready时可以直接抢占CPU这事再加上互斥就容易出问题了。比如三个任务H,M,L,优先级递减同时H和L共享资源R。当L先申请到互斥锁访问临界区还没释放R的时候H这时候申请R访问导致自己挂起这么巧M变ready了OS调度让M抢占了L的cpu。如果L一直得不到执行并释放R这样就造成了高优先级的H得不到执行反而一些比H优先级低的M们能得到CPU。这就是优先级反转。实时OS的高优先级任务一般都是比较重要的任务需要马上处理得不到处理意味着可能要出大事。所以这个问题的影响还是挺大的比较著名的例子就是火星探路者的故事可以参考一下火星探路者故障分析。解决方法也有不少尽量避免不同优先级的任务共享资源可以通过信息容易做任务间通信。访问临界区时关闭中断保证临界区的代码执行不被强占。嵌入式编程中常用。优先级继承当有高优先级任务想要访问共享资源时提高正在执行的低优先级任务的优先级到高优先级级别直至退出临界区。上面的探路者修正程序使用了该方法。随机提高ready且持有锁的任务优先级windows用了该方法。Multi Threads应用场景写了这么多那到底什么时候可以应用多线程来解决问题呢根据经验一般下面一些场景我们可以考虑使用多线程。多核处理器任务比较容易切分为并行处理的小块。如果是计算密集型的线程数量可以考虑跟core的数量相当。有delay比较多的IO操作可以考虑将IO的操作分离给单独的线程。有人机交互和实时响应等实时性要求较高任务可以考虑分离为优先级较高的线程。有大量实时要求不高的计算可以考虑分离为优先级较低的后台任务。Thread编程模型实事求是具体问题具体分析是放之四海而皆准的问题解决之道所以没有普适的编程模型。下面列举3种应用比较多的模型以供学习。Thread Pool (Master/Worker)通过线程池维护一组可用的线程master作为主线程负责管理维护worker线程同时负责对外接口和工作的分发。Peer (Workcrew)跟master/worker类似只是master在启动线程池后退化为普通一员大家一起分担任务没有主从的星形拓扑结构。Pipeline跟CPU的pipline技术类似将一个工作流分成很多串行的部分每一部分都由不同的线程负责大家各司其职我做完我的工作就转交给下一个线程齐心协力最后完成整个工作。流水线如果拍的好可以很好的提高工作效率但是这种模型风险也比较大一定要处理好工作的切分和线程间的交互。POSIX API详解Thread managementpthread_create (thread,attr,start_routine,arg) #创建threadpthread_exit (status) # thread退出pthread_cancel (thread) # 退出指定的threadpthread_attr_init (attr) #初始化thread属性pthread_attr_destroy(attr)pthread_setaffinity_np or sched_setaffinity # 设置thread可运行的CPU也就是绑定CPUpthread_join (threadid,status) # 阻塞等待threadid指定的thread完成pthread_detach (threadid) # 线程创建默认是joinable调用该函数设置线程的状态为detached,则该线程运行结束后会自动释放所有资源别人再join等待它时候不会阻塞了。pthread_attr_setdetachstate (attr,detachstate)pthread_attr_getdetachstate (attr,detachstate)pthread_self () # 返回自己所在的线程idpthread_equal (thread1,thread2) # 比较两个线程大部分API见名思意比较简单详细看一下pthread_create.#include int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);参数说明thread: 指针所指向的内存存储新创建thread的属性返回给caller来标识该线程attr: thread的配置参数集start_routine: thread创建后执行的处理函数thread的主体arg: start_routine的入参功能说明创建thread API成功后返回0. 创建的thread跟创建者是平行关系没有等级继承关系。thread有以下属性Detached or joinable stateScheduling inheritanceScheduling policyScheduling parametersScheduling contention scopeStack sizeStack addressStack guard (overflow) sizeMutexespthread_mutex_init (mutex,attr) # 动态生成一个mutex变量pthread_mutex_destroy (mutex) # 释放mutex变量pthread_mutexattr_init (attr) # 设置mutex属性pthread_mutexattr_destroy (attr)pthread_mutex_lock (mutex) # lock操作如果mutex已经lock调用者会阻塞pthread_mutex_trylock (mutex) # 尝试lock非阻塞调用pthread_mutex_unlock (mutex) # unlock操作Condition variablespthread_cond_init (condition,attr)pthread_cond_destroy (condition)pthread_condattr_init (attr)pthread_condattr_destroy (attr)pthread_cond_wait (condition,mutex) # 调用者阻塞直到condition条件成立注意调用者阻塞时会自动释放mutex,唤醒时会自动lock mutex。调用前确保lock mutex调用后确保调用unlock mutexpthread_cond_signal (condition) # 通知对方条件满足调用前确保lock mutex调用后确保调用unlock mutexpthread_cond_broadcast (condition)条件变量是另外一种线程间同步的方式其实是一种挂起和唤醒的通信方式。可以理解为定义一个条件变量定义了一个线程间的通信通道wait这个变量一方其实是在等待有人在这个通道上发个信号来如果没有人发信号他就一直阻塞挂起。它需要跟mutex配合使用直接通过一个例子感受一下。条件变量的存在就是让wait的这一方睡起来直到有人通知它条件满足可以起来干活了否则没有条件变量只用mutex做同步这个wait的一方需要不断的查询是否条件满足低效浪费。#include #include #include #define NUM_THREADS 3#define TCOUNT 10#define COUNT_LIMIT 12int count 0;pthread_mutex_t count_mutex;pthread_cond_t count_threshold_cv;void *inc_count(void *t){int i;long my_id (long)t;for (i0; i TCOUNT; i) {pthread_mutex_lock(count_mutex);count;/*Check the value of count and signal waiting thread when condition is reached. Note that this occurs while mutex is locked.*/if (count COUNT_LIMIT) {printf(inc_count(): thread %ld, count %d Threshold reached. ,my_id, count);pthread_cond_signal(count_threshold_cv);printf(Just sent signal.\n);}printf(inc_count(): thread %ld, count %d, unlocking mutex\n,my_id, count);pthread_mutex_unlock(count_mutex);/* Do some work so threads can alternate on mutex lock */sleep(1);}pthread_exit(NULL);}void *watch_count(void *t){long my_id (long)t;printf(Starting watch_count(): thread %ld\n, my_id);/*Lock mutex and wait for signal. Note that the pthread_cond_wait routinewill automatically and atomically unlock mutex while it waits.Also, note that if COUNT_LIMIT is reached before this routine is run bythe waiting thread, the loop will be skipped to prevent pthread_cond_waitfrom never returning.*/pthread_mutex_lock(count_mutex);while (count COUNT_LIMIT) {printf(watch_count(): thread %ld Count %d. Going into wait...\n, my_id,count);pthread_cond_wait(count_threshold_cv, count_mutex);printf(watch_count(): thread %ld Condition signal received. Count %d\n, my_id,count);printf(watch_count(): thread %ld Updating the value of count...\n, my_id,count);count 125;printf(watch_count(): thread %ld count now %d.\n, my_id, count);}printf(watch_count(): thread %ld Unlocking mutex.\n, my_id);pthread_mutex_unlock(count_mutex);pthread_exit(NULL);}int main(int argc, char *argv[]){int i, rc;long t11, t22, t33;pthread_t threads[3];pthread_attr_t attr;/* Initialize mutex and condition variable objects */pthread_mutex_init(count_mutex, NULL);pthread_cond_init (count_threshold_cv, NULL);/* For portability, explicitly create threads in a joinable state */pthread_attr_init(attr);pthread_attr_setdetachstate(attr, PTHREAD_CREATE_JOINABLE);pthread_create(threads[0], attr, watch_count, (void *)t1);pthread_create(threads[1], attr, inc_count, (void *)t2);pthread_create(threads[2], attr, inc_count, (void *)t3);/* Wait for all threads to complete */for (i 0; i NUM_THREADS; i) {pthread_join(threads[i], NULL);}printf (Main(): Waited and joined with %d threads. Final value of count %d. Done.\n,NUM_THREADS, count);/* Clean up and exit */pthread_attr_destroy(attr);pthread_mutex_destroy(count_mutex);pthread_cond_destroy(count_threshold_cv);pthread_exit (NULL);}Synchronizationpthread_rwlock_destroypthread_rwlock_initpthread_rwlock_rdlockpthread_rwlock_timedrdlockpthread_rwlock_timedwrlockpthread_rwlock_tryrdlockpthread_rwlock_trywrlockpthread_rwlock_unlockpthread_rwlock_wrlockpthread_rwlockattr_destroypthread_rwlockattr_getpsharedpthread_rwlockattr_initpthread_rwlockattr_setpshared上面提到的读写锁。允许多个reader同时share读锁如果有reader在读writer申请锁会block直到所有reader释放。

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

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

相关文章

网站301检测有什么网站是学做吃的

1.原因分析 后端没接收到uid可能是前端没传递uid也可能是前端传递了uid,但是传递方式与后端接收方式不匹配,导致没接收到更大的可能是因为后端请求方式错了。比如: 2.解决方案 先确定前端传参方式与后端请求方式是匹配的后端get请求的话…

企业网站需要多少费用美篇制作app下载官网免费

题目 有一个大小是N * M的战场地图,被墙壁’#‘分隔成大小不同的区域,上下左右四个方向相邻的空地∵,属于同一个区域,只有空地上可能存在敌人’E’,请求出地图上总共有多少区域里的敌人数小于K。 输入描述 第一行输入为…

网站备案注销找哪个部门软件商店打不开怎么办

java学习 一.io流 简介:io,i代表in,指的是输入,o代表输出。io流是用于处理输入和输出数据的机制。Java的io流主要分为字节流和字符流两种类型。这些流可以用于读取和写入不同类型的数据,如文本,图片&#…

济南做网站 推荐行知科技2022年网络流行语

1、一个人经历了所有的苦难,也不要指望能和谁在一起;我曾经真诚的尝试过,但是结果我不想说。2、只要你愿意,只要我有,整个世界都是你的,而你只能是我的。3、只要你愿意,当你失落失意的时候&…

哪个网站买域名便宜深圳制作网站制作公司

官方扩容指导文档 PVE给虚拟机磁盘扩容 给虚拟机磁盘扩容,选中OpenWRT的硬盘,随后选择调整大小 输入增量大小,即增加多少磁盘空间给硬盘。这里我选择增加4G 进入OpenWRT控制台界面安装一些linux常用查看磁盘的工具(也可以通过网…

微信推广时间关键词优化怎么弄

1、MySQL卸载: (通过yum命令卸载之前安装的mysql, find命令找到mysql文件,再用rm –rf 强制删除/var/lib/mysql) 2、MySQL安装: (使用yum命令安装mysql,安装完成后启动数据库&#x…

黑色炫酷的监控网站html郑州网站建设平台

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准, 具有 0.05% 初始精度、低功耗特点。该器件的低输出电压迟滞和低长期输出电压 漂移特性,进一步提高稳定性和系统可靠性。 此外,器件的小尺寸和低运行 电流特性使其非常适合便携…

网站热区图利用关键词进网站后台

网站运营者的救星:雷池WAF社区版 ️ 嘿朋友们!今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说,简直就是保护伞! 智能语义分析技术:超级侦探上线 先说说为啥我这么稀饭它。雷…

安徽集团网站建设亚马逊海外购官方网

这里贴一下自己的模拟SPI驱动,移植的话需要实现SPI管脚的定义和初始化。 一、管脚初始化 MOSI_PIN:设置MOSI为输出模式SCK_PIN:设置SCK为输出模式CSN_PIN:设置CSN为输出模式MISO_PIN:设置MISO为输入模式MOSI_PIN_HIG…

做网站需要要多少钱企业网络品牌维护

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

网站套站是什么意思网站做电话线用

Pycharm Conda虚拟环境 设置终端进入特定分支而不是主环境base 问题描述 我的电脑有pycharm和anaconda。pycharm采用conda作为管理工具。我每次建立一个pycharm项目,都会为这个项目建立对应的conda解释器。当我希望采用pycharm里的终端时,我希望进入的…

江苏省宿迁市建设局网站首页通知书

文章目录 前言一、获取小程序栈二、生命周期触发总结 前言 界面由A到B,在由B返回A,触发刷新动作 一、获取小程序栈 界面A代码 shuaxin(){//此处可进行接口请求从而实现更新数据的效果console.log("刷新本页面数据啦")},界面B代码 // 返回触…

东莞网站建设全过程网页搜索引擎

转载自 java字符串格式化:String.format()方法的使用常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的读者应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。 l for…

英文版网站案例百度指数快刷软件

介绍 JavaScript,简称 JS,是一种用于网页开发的编程语言。作为 Web 的核心技术之一,JavaScript 与 HTML 和 CSS 一起用于使网页具有交互性并构建 Web 应用程序。现代 Web 浏览器遵循通用的显示标准,通过内置引擎支持 JavaScript&…

青岛市规划建设局网站不用php做网站

问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n) h(0)*h(n-1)h(1)*h(n-2) ... h(n-1)h(0) (其中n>2,h(0) h(1) 1) 该递推关系的解为&…

廊坊网站建设哪家好网站建设进度计划表

消息认证码(Message Authentication Code,MAC)是一种用于验证消息完整性和真实性的密码学算法。MAC通常与密钥一起使用,以确保接收方可以验证消息未被篡改或伪造。以下是MAC的一些重要特点和常见算法: 特点&#xff1…

可以做ppt的网站特殊符号网名生成器

全网唯一值得推荐的C/C框架和库 C程序员开发指南 ​ 关注我,天天分享C/C开发技术干货! ​关注他 30 人赞同了该文章 ​ 目录 收起 标准库 C通用框架和库 人工智能 异步事件循环 音频 生态学 压缩 并发性 容器 数据库 调试 游戏引擎 图…

做购票系统网站团购网站开发语言

作为一名在数字化转型项目中摸爬滚打的实践者,我们见证了数据从简单的信息处理工具逐渐演变为驱动经济社会发展的关键要素。近日,多部门联合发布的《“数据要素”三年行动计划(2024—2026年)》更是将数据要素的重要性提升到了新的…

组建网站营销策略的重要性

原文链接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-api/在本教程中,我将展示如何构建一个查询API,使用命令查询职责分离(CQRS)模式在微服务架构中实现查询。读取模型的目标是构建一个…

邹平做网站手机端网站开发页

一只小狐狸带你解锁 炼丹术&NLP 秘籍作为算法工程师,基础知识的重要性自然不必多说。虽然在有些项目中比较难感受到基础的作用,但扎实的coding能力,对算法本质和适用情况的理解,始终是决定工作效率与未来发展的重要feature。这…