南京网站推广排名wordpress返回html原理

news/2025/9/26 15:10:37/文章来源:
南京网站推广排名,wordpress返回html原理,教师网络培训和服务平台,只做公司网站方案LinuxC高级编程——线程间同步 宗旨#xff1a;技术的学习是有限的#xff0c;分享的精神是无限的。 1、 互斥锁mutex 多个线程同时访问共享数据时可能会冲突。对于多线程的程序#xff0c;访问冲突的问题是很普遍的#xff0c;解决的办法是引入互斥锁#xff08;Mutex技术的学习是有限的分享的精神是无限的。 1、 互斥锁mutex 多个线程同时访问共享数据时可能会冲突。对于多线程的程序访问冲突的问题是很普遍的解决的办法是引入互斥锁Mutex Mutual Exclusive Lock获得锁的线程可以完成“读-修改-写”的操作然后释放锁给其它线程没有获得 锁的线程只能等待而不能访问共享数据这样“读-修改-写”三步操作组成一个原子操作要么都执行要么都不执行不会执行到中间被打断也不会在其它处理器上并行做这个操作。Mutex用pthread_mutex_t类型的变量表示可以这样初始化和销毁 #includepthread.h int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *restrict mutex,constpthread_mutexattr_t *restrict attr); pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; 返回值成功返回0失败返回错误号。 pthread_mutex_init函数对Mutex做初始化参数attr设定Mutex的属性如果attr为NULL则表示缺省属性用pthread_mutex_init函 数初始化的Mutex可以用pthread_mutex_destroy销毁。如果Mutex变量是静态分配的全局变量 或static变量也可以用宏定义PTHREAD_MUTEX_INITIALIZER来初始化相当于用pthread_mutex_init初始化并且attr参数为NULL。 Mutex的加锁和解锁操作可以用下列函数 #includepthread.h int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); 返回值成功返回0失败返回错误号。 一个线程可以调用pthread_mutex_lock获得Mutex如果这时另一个线程已经调用pthread_mutex_lock获得了该Mutex则当前线程需要挂起等待直到另一个线程调用pthread_mutex_unlock释放Mutex当前线程被唤醒才能获得该Mutex并继续执行。 如果一个线程既想获得锁又不想挂起等待可以调用pthread_mutex_trylock如果Mutex已经被另一个线程获得这个函数会失败返回EBUSY而不会使线程挂起等待。  #include stdio.h #include stdlib.h #include pthread.h#define NLOOP 5000 int counter; /* incremented by threads */pthread_mutex_t counter_mutex PTHREAD_MUTEX_INITIALIZER;void *doit(void *);int main(int argc, char **argv) {pthread_t tidA, tidB;pthread_create(tidA, NULL, doit, NULL);pthread_create(tidB, NULL, doit, NULL);/* wait for both threads to terminate */pthread_join(tidA, NULL);pthread_join(tidB, NULL);return 0; } void *doit(void *vptr) {int i, val;for (i 0; i NLOOP; i){pthread_mutex_lock(counter_mutex);val counter;printf(%x: %d\n, (unsigned int)pthread_self(), val 1);counter val 1;pthread_mutex_unlock(counter_mutex);}return NULL; } 2、 条件变量 线程A需要等某个条件成立才能继续往下执行现在这个条件不成立线程A就阻塞等待而线程B在执行过程中使这个条件成立了就唤醒线程A继续执行。 在pthread库中通过条件变量Condition Variable 来阻塞等待一个条件或者唤醒等待这个条件的线程。 Condition Variable用pthread_cond_t类型的变量表示可以这样初始化和销毁 #include pthread.h int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t*restrict attr); pthread_cond_t cond PTHREAD_COND_INITIALIZER; 返回值成功返回0失败返回错误号。 和Mutex的初始化和销毁类似pthread_cond_init函数初始化一个Condition Variable attr参数 为NULL则表示缺省属性 pthread_cond_destroy函数销毁一个Condition Variable。如果Condition Variable是静态分配的也可以用宏定义PTHEAD_COND_INITIALIZER初始化相当于 用pthread_cond_init函数初始化并且attr参数为NULL。 Condition Variable的操作可以用下列函数 #include pthread.h int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t*restrict mutex, const struct timespec *restrict abstime); int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrictmutex); int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond); 返回值成功返回0失败返回错误号。 可见一个ConditionVariable总是和一个Mutex搭配使用的。一个线程可以调 用pthread_cond_wait在一个Condition Variable上阻塞等待这个函数做以下三步操作 1.  释放Mutex   2. 阻塞等待   3. 当被唤醒时重新获得Mutex并返回. pthread_cond_timedwait函数还有一个额外的参数可以设定等待超时如果到达了abstime所指定的 时刻仍然没有别的线程来唤醒当前线程就返回ETIMEDOUT。一个线程可以调 用pthread_cond_signal唤醒在某个Condition Variable上等待的另一个线程也可以调用pthread_cond_broadcast唤醒在这个Condition Variable上等待的所有线程。  #include stdlib.h #include pthread.h #include stdio.hstruct msg {struct msg *next;int num; };struct msg *head; pthread_cond_t has_product PTHREAD_COND_INITIALIZER; pthread_mutex_t lock PTHREAD_MUTEX_INITIALIZER;void *consumer(void *p) {struct msg *mp;for (;;){pthread_mutex_lock(lock);while (head NULL){pthread_cond_wait(has_product, lock);}mp head;head mp-next;pthread_mutex_unlock(lock);printf(Consume %d\n, mp-num);free(mp);sleep(rand() % 5);} } void *producer(void *p) {struct msg *mp;for (;;){mp malloc(sizeof(struct msg));mp-num rand() % 1000 1;printf(Produce %d\n, mp-num);pthread_mutex_lock(lock);mp-next head;head mp;pthread_mutex_unlock(lock);pthread_cond_signal(has_product);sleep(rand() % 5);} }int main(int argc, char *argv[]) {pthread_t pid, cid;srand(time(NULL));pthread_create(pid, NULL, producer, NULL);pthread_create(cid, NULL, consumer, NULL);pthread_join(pid, NULL);pthread_join(cid, NULL);return 0; } 3、 信号量 Mutex变量是非0即1的可看作一种资源的可用数量初始化时Mutex是1表示有一个可用资源加锁时获得该资源将Mutex减到0表示不再有可用资源解锁时释放该资源将Mutex重新加到1表示又有了一个可用资源。信号量Semaphore和Mutex类似表示可用资源的数量和Mutex不同的是这个数量可以大于1. #include semaphore.h int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_post(sem_t * sem); int sem_destroy(sem_t * sem); semaphore变量的类型为sem_t sem_init()初始化一个semaphore变量 value参数表示可用资源 的数量 pshared参数为0表示信号量用于同一进程的线程间同步本节只介绍这种情况。在用 完semaphore变量之后应该调用sem_destroy()释放与semaphore相关的资源。 调用sem_wait()可以获得资源使semaphore的值减1如果调用sem_wait()时semaphore的值已 经是0则挂起等待。如果不希望挂起等待可以调用sem_trywait()。调用sem_post()可以释放资 源使semaphore的值加1同时唤醒挂起等待的线程。 #include stdlib.h #include pthread.h #include stdio.h #include semaphore.h#define NUM 5 int queue[NUM]; sem_t blank_number, product_number;void *producer(void *arg) {int p 0;while (1){sem_wait(blank_number);queue[p] rand() % 1000 1;printf(Produce %d\n, queue[p]);sem_post(product_number);p (p 1) % NUM;sleep(rand() % 5);} }void *consumer(void *arg) {int c 0;while (1){sem_wait(product_number);printf(Consume %d\n, queue[c]);queue[c] 0;sem_post(blank_number);c (c 1) % NUM;sleep(rand() % 5);} }int main(int argc, char *argv[]) {pthread_t pid, cid;sem_init(blank_number, 0, NUM);sem_init(product_number, 0, 0);pthread_create(pid, NULL, producer, NULL);pthread_create(cid, NULL, consumer, NULL);pthread_join(pid, NULL);pthread_join(cid, NULL);sem_destroy(blank_number);sem_destroy(product_number);return 0; }

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

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

相关文章

南京做公司网站网页设计模板免费网站

本人最近转行开始做海外独立游戏的发行,主要是负责服务器,开会注意到海外的服务越来越丰富越来越细分,对国内将会造成很大的冲击,比如AWS,Google,GameSparks等,这导致国内的所谓服务器开发将越来越简单,国内对服务器开发的需求越来越少,反而客户端的需求越来越多,所以…

Gradle读取仓库配置文件的优先级

Gradle 在读取仓库配置文件(如 settings.gradle 或 build.gradle 中定义的 repositories)时,遵循一定的优先级规则。以下是 Gradle 读取仓库配置文件的优先级顺序:1. 项目级配置文件settings.gradle:这是 Gradle …

opencv学习记录5

轮廓检测和模板匹配轮廓检测 #先转化为二值图 img = cv2.imread(name) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)cv2.findContours(img,mode,method)…

PCS PMA,如何理解硬核IP

xilinx fpga中,serdes部分肯定是硬核(也可以理解为phy部分),因为serdes是数模混合的,相当于FPGA内部有一块地方是这个模块已经布局布线好了,模块的时序是得到保证的,高速的IP核自动布局布线很难达到高频下的时序…

pycharm中使用调试模式运行 uvicorn.run(app)报错TypeError: _patch_asyncio.locals.run() got an unexpected keywor解决

问题出现和解决过程 近期更新了pycharm版本从2023.01.06升级了2025.2.1版本,但是在升级之后,使用pycharm的调试模式运行uvicorn.run(app)报错如下: 产生过以下几个可能性猜测fastapi和uvicorn版本不匹配的问题 但是…

交换机命令

1、检查区域汇聚设备接入端口,在线端口及描述 检查在线端口命令 show int status 检查端口描述命令 show int description 登陆方式,CRT超级终端 telnet IP 地址,用户名为admin 密码见表 show run 查看现有配置 …

2025.9.25

完成了MySQL学习,开始Mybatis,Spring,SpringMVC,争取国庆前把这三个学完

空间三维坐标变换(转)-四元数-RowPitchYaw角互换

空间三维坐标变换(转)-四元数-RowPitchYaw角互换 1、空间三维坐标系的平移(矢量加法获取) 解题思路:根据适量的加法即可求解= + 2、空间三维坐标系的旋转(旋转矩阵) 关键是:姿态矩阵(或称之为“旋转矩阵”)…

易基因:Cell Rep:华农任文凯团队利用ChIP-seq及多组学解析过敏性疾病的关键调控机制|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,华南农业大学动物科学学院Yaoyao Xia、宾朋等为共同第一作者,任文凯教授为唯一通讯作者在《Cell Reports》期刊上发表题为“Glycerophospholi…

为什么做免费视频网站网站内容页相关性怎么做

目前,市场上的芯片主要包括指令集架构和数据流架构两种实现方式。指令集架构主要包括X86架构、ARM架构、精简指令集运算RISC-V开源架构,以及SIMD架构。总体来说,四者都属于传统的通用指令集架构。传统的指令集架构采用冯诺依曼计算方式&#…

网站设计自学seo的特点是什么

一、前言 最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文式1与式2中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限&am…

详细介绍:STL 容器 --- list 类

详细介绍:STL 容器 --- list 类pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

Idea代码回退已经push到远段仓库的代码分支到指定提交记录

步骤一:先打开git对应分支提交记录,回退本地代码到指定commitId。等待提交记录删除。 步骤二:找到要回退的commitId,并清除远端git提交记录Soft:仅移动分支指针,保留工作目录和暂存区的所有修改。相当于撤销了提…

开写第一篇

我的知识能力都是祂所赐的,若不靠着祂我什么也不能做 开写第一篇博客了,之前笔记也记了不少,但是没有正经的整理过,现在开始陆续整理上传。以前总是网上看别人写的技术博客,学了不少东西,希望我自己写的也能帮助…

重庆家居网站制作公司傻瓜建网站

java处理ip的工具类,包括把long类型的Ip转为一般Ip类型、把xx.xx.xx.xx类型的转为long类型、根据掩码位获取掩码、根据 ip/掩码位 计算IP段的起始IP、根据 ip/掩码位 计算IP段的终止IP等方法,可以直接使用!package com.hh.test;import java.u…

大模型function calling多轮对话开发示例

OpenAI接口支持的function calling使得大模型能够方便的集成外部能力和数据,是实现agent(智能体)的重要基础,能让LLM和各种功能集成,从而解决复杂的问题。 对于兼容openai接口的大模型如阿里的通义千问,也是可以使…

ViTables 安装与 HDF5 数据可视化全指南 - 实践

ViTables 安装与 HDF5 数据可视化全指南 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

elementuiplus修改el-checked多选框样式

elementuiplus修改el-checked多选框样式废话不多说直接上代码: 1、给check加类名 2、css样式:/deep/.image-checkbox .el-checkbox__input .el-checkbox__inner {/* 隐藏原生复选框 */display: none; }/deep/.image…

怎样用dw做 网站首页网站关键词排行查询

首先,对于零基础的想学习C的同学,我想要你们先明白一件事:C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言,在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…

宜昌营销网站建设ppt模板免费下载素材医学类

一,dns与域名 网络基于tcp/ip协议进行通信和连接的,其中主机以ip地址做固定的地址标识,用以区分用户和计算机。ip地址是由32位二进制数组成,不方便记忆。为了方便记忆,采用了域名。但是网络通信的唯一标识是ip地址&…