• [技术干货] IOT开发基础知识系列--Linux(pthread)线程通信(信号量)
    1. 信号量介绍信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。总结信号量也主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个线程或者多个线程独享。信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间共享资源引发的同步问题。信号量就是一个计数变量,内部本身就是一个变量。只不过这个变量具有原子性。信号量经常用来保护临界区资源、实现资源同步。如果信号量只有2个值,0和1,就称为二值信号量==互斥锁。信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区,要使用信号量同步,需要包含头文件semaphore.h。2. 信号量实现接口函数2.1 初始化信号量#include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); //通常 pshared 为 0.表示线程间sem_init是创建信号量的 API,其中 value 为信号量的初值,pshared 表示是否为多进程共享而不仅仅是用于一个进程之间的多线程共享。如果pshared的值为0,那么信号量在进程的线程之间共享,并且应位于所有线程可见的某个地址(例如,全局变量)能够,或在堆上动态分配的变量),如果pshared不为零,那么信号量在进程之间共享,信号量的值就位于共享内存区域。2.2 注销信号量int sem_destroy(sem_t * sem);注销信号量时,必须保证被注销的信号量 sem没有线程在等待该信号量,否则会返回-1,且置 errno 为 EBUSY。正常返回0。2.3 释放信号量int sem_post(sem_t * sem); //相当于解锁释放信号量操作将信号量值原子地加 1,表示增加一个可访问的资源。只有信号量值大于 0,才能访问公共资源。主要用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞。2.4 等待信号量int sem_wait(sem_t * sem); //相当于加锁 int sem_trywait(sem_t * sem); //不阻塞sem_wait()用于阻塞等待信号量(获取信号量),主要被用来阻塞当前线程直到信号量 sem 的值大于 0,得到信号量之后,信号量的值会减一。2.5 获取当前的信号量值int sem_getvalue(sem_t * sem, int * sval);读取sem中的信号量计数,存于*sval 中,并返回 0。3. 案例代码: 信号量框架运用模型#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> sem_t sem; //信号量结构 int data; /* 线程工作函数 */ void *thread_work_func(void *dev) { while(1) { sem_wait(&sem); //获取信号量. 当信号量的值大于0才能获取成功. -- printf("data=Þ10b1671-8271-4633-8cfe-0f83a4c18fe0n",data); sem_post(&sem); //释放信号量. ++ sleep(1); } } /* 线程工作函数 */ void *thread_work_func2(void *dev) { while(1) { sem_wait(&sem); //获取信号量. 当信号量的值大于0才能获取成功. -- data++; sem_post(&sem); //释放信号量. ++ sleep(1); } } int main(int argc,char **argv) { //初始化信号量 sem_init(&sem,0,1); /*1. 创建子线程1*/ pthread_t thread_id; if(pthread_create(&thread_id,NULL,thread_work_func,NULL)!=0) { printf("子线程1创建失败.\n"); return -1; } /*2. 创建子线程2*/ pthread_t thread_id2; if(pthread_create(&thread_id2,NULL,thread_work_func2,NULL)!=0) { printf("子线程2创建失败.\n"); return -1; } /*3. 等待线程的介绍*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //销毁信号量 sem_destroy(&sem); return 0; }Linux系统编程-(pthread)线程通信(信号量)
  • [技术干货] IOT开发基础知识系列--Linux(pthread)线程通信(围栏机制)
    1. 围栏机制介绍Linux线程里还支持一个围栏机制--也就是屏障功能。这个围栏机制,可以设置等待的线程数量,当指定数量的线程都到齐之后再全部唤醒—放行。它的的功能和它的名字是匹配的,就是围栏,就像在赛跑比赛场上,要进行比赛时,必须等待所有运动员都到齐全了,都到起跑线上了,然后一声令下,大家再一起跑出去。在Linux线程里的屏障功能由pthread_barrier 系列函数实现,在<pthread.h>中定义,功能主要是用于多线程的同步。2. 围栏机制相关的函数介绍相关的函数接口如下:#include <pthread.h> 1. 销毁围栏 int pthread_barrier_destroy(pthread_barrier_t *barrier); 参数: pthread_barrier_t*就是围栏机制的结构。 2. 初始化围栏 int pthread_barrier_init(pthread_barrier_t *restrict barrier,const pthread_barrierattr_t *restrict attr, unsigned count); 参数: unsigned count 表示需要等待的线程数量,必须有这么多线程都在等待了,栏杆才会放行。 3. 等待条件成立 int pthread_barrier_wait(pthread_barrier_t *barrier); 功能: 阻塞等待线程的数量到齐,这个数量在初始化的时候设置,全部成立了,再返回。3. 围栏机制使用案例1下面代码里设置栏杆等待线程数量为10个,然后启动循环创建10个线程,当10个线程创建完毕之后,一起运行。设置线程为分离属性。#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> pthread_barrier_t barrier; /* 线程工作函数 */ void *thread_work_func(void *dev) { int i=(int)dev; printf("第%d个线程等待运行...\n",i); //等待线程的数量 pthread_barrier_wait(&barrier); printf("第%d个线程开始运行...\n",i); } int main(int argc,char **argv) { //初始化栏杆机制 pthread_barrier_init(&barrier,NULL,10); /*创建子线程*/ pthread_t thread_id; int i; for(i=0;i<10;i++) { if(pthread_create(&thread_id,NULL,thread_work_func,(void*)i)!=0) { printf("子线程%d创建失败.\n",i); return -1; } //设置线程的分离属性 pthread_detach(thread_id); sleep(1); } pause(); //暂停 //销毁围栏机制 pthread_barrier_destroy(&barrier); return 0; }4. 围栏机制使用案例2下面代码里设置栏杆等待线程数量为10个,然后启动循环创建10个线程,每个新的线程创建之后,都会在函数里打印第几个线程准备运行,当10个线程创建完毕之后,都在等待了,然后再一起放行。设置线程为结合属性。#include <stdio.h> #include <sys/types.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <semaphore.h> #include <signal.h> pthread_barrier_t barrier; //线程工作函数 void *thread_work_func(void *arg) { printf("线程%lu准备运行.\n",pthread_self()); //等待人员到齐 pthread_barrier_wait(&barrier); printf("线程%lu开始运行.\n",pthread_self()); } int main(int argc,char **argv) { pthread_barrier_init(&barrier,NULL,10); /*1. 创建线程*/ pthread_t thread_id[10]; int i; for(i=0;i<10;i++) { if(pthread_create(&thread_id[i],NULL,thread_work_func,NULL)) { printf("%d线程创建失败.\n",i); return 0; } sleep(1); } /*2. 等待子线程结束*/ for(i=0;i<10;i++) { pthread_join(thread_id[i],NULL); } pthread_barrier_destroy(&barrier); return 0; }
  • [技术干货] IOT开发基础知识系列--(pthread)线程通信(条件变量)
    1. 条件变量介绍条件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。条件变量本身是由互斥体保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获取互斥量之前就不会觉察到这种变化,因为互斥量必须锁定之后才改变条件。条件变量总结:条件变量要配合互斥锁使用。条件变量支持单个唤醒和广播方式唤醒。下面是视频监控的一个项目模型,摄像头的数据使用条件变量保护:2. 条件变量相关接口函数2.1 条件变量初始化与销毁#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); 用法示例示例: pthread_cond_t cond; pthread_cond_init(&cond, NULL); int pthread_cond_destroy(pthread_cond_t *cond); 成功返回0,否则返回错误码pthread_cond_init 用于初始化条件变量,最后使用完毕需要调用pthread_cond_destroy销毁。2.2 条件变量等待与唤醒#include<pthread.h> int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal (pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);pthread_cond_broadcast 函数用于广播唤醒所有等待条件的休眠线程。pthread_cond_signal函数按顺序唤醒一个休眠的线程。pthread_cond_wait 函数阻塞方式等待条件成立。第二个参数填互斥锁指针。总结:pthread_cond_signal函数一次性可以唤醒阻塞队列中的一个线程,pthread_cond_broadcast函数一次性可以唤醒阻塞队列中的所有线程。3. 案例代码: 条件变量使用案例#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <signal.h> pthread_cond_t cond; pthread_mutex_t mutex; /* 线程工作函数--消费者 */ void *thread_work_func(void *dev) { int i=(int)dev; printf("第%d个线程等待运行...\n",i); //互斥锁上锁 pthread_mutex_lock(&mutex); printf("互斥锁上锁成功.%d \n",i); pthread_cond_wait(&cond,&mutex); //内部先解锁再加锁 pthread_mutex_unlock(&mutex); printf("第%d个线程开始运行...\n",i); } //信号工作函数---生产者 void signal_work_func(int sig) { printf("正在唤醒休眠的线程.\n"); pthread_mutex_lock(&mutex); pthread_cond_broadcast(&cond); //广播唤醒 //pthread_cond_signal (&cond); //唤醒单个休眠的线程 pthread_mutex_unlock(&mutex); } int main(int argc,char **argv) { //注册要捕获的信号 signal(SIGINT,signal_work_func); //初始化条件变量 pthread_cond_init(&cond,NULL); //初始化互斥锁 pthread_mutex_init(&mutex,NULL); /*创建子线程*/ pthread_t thread_id; int i; for(i=0;i<10;i++) { if(pthread_create(&thread_id,NULL,thread_work_func,(void*)i)!=0) { printf("子线程%d创建失败.\n",i); return -1; } //设置线程的分离属性 pthread_detach(thread_id); sleep(1); } while(1) { } //销毁条件变量 pthread_cond_destroy(&cond); //销毁互斥锁 pthread_mutex_destroy(&mutex); return 0; }
  • [技术干货] IOT开发基础知识系列--Linux(pthread)线程通信(互斥锁)
    这篇文章介绍Linux下线程同步与互斥机制--互斥锁,在多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多。互斥锁就是用来保护某一个资源不能同时被2个或者2个以上的线程使用。为什么需要加锁? 就是因为多个线程共用进程的资源,要访问的是公共区间时(全局变量),当一个线程访问的时候,需要加上锁以防止另外的线程对它进行访问,以实现资源的独占。在一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程才能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。1. 互斥锁介绍在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。Linux系统下定义了一套专门用于线程互斥的mutex函数。mutex 是一种简单的加锁的方法来控制对共享资源的存取,这个互斥锁只有两种状态(上锁和解锁),可以把互斥锁看作某种意义上的全局变量。总结: 互斥锁可以保护某个资源同时只能被一个线程所使用。2. 互斥锁相关的函数#include <pthread.h> //销毁互斥锁 int pthread_mutex_destroy(pthread_mutex_t *mutex); //初始化互斥锁 int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); //上锁: 阻塞方式 int pthread_mutex_lock(pthread_mutex_t *mutex); //上锁: 非阻塞方式 int pthread_mutex_trylock(pthread_mutex_t *mutex); //解锁 int pthread_mutex_unlock(pthread_mutex_t *mutex); 说明: 对于Linux下的信号量/读写锁文件进行编译,需要在编译选项中指明-D_GNU_SOURCE 否则用gcc编译就会出现 PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP未声明(在此函数内第一次使用) 这样的提示。 例如: $ gcc app.c -lpthread -D_GNU_SOURCE2.1 初始化互斥锁头文件 #include <pthread.h> 定义函数 int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutex_attr_t* attr ); 函数说明 该函数初始化一个互斥体变量,如果参数attr 为NULL,则互斥体变量mutex 使用默认的属性。2.2 销毁互斥锁头文件 #include <pthread.h> 定义函数 int pthread_mutex_destroy ( pthread_mutex_t *mutex ); 函数说明 该函数用来释放分配给参数mutex 的资源。 返回值 调用成功时返回值为 0, 否则返回一个非0 的错误代码。2.3 上锁头文件 #include <pthread.h> 定义函数 int pthread_mutex_lock( pthread_mutex_t *mutex ); 函数说明 该函数用来锁住互斥体变量。如果参数mutex 所指的互斥体已经被锁住了,那么发出调用的线程将被阻塞直到其他线程对mutex 解锁。 如果上锁成功,将返回0。2.4 尝试上锁-非阻塞表头文件 #include <pthread.h> 定义函数 int pthread_mutex_trylock( pthread_t *mutex ); 函数说明 该函数用来锁住mutex 所指定的互斥体,但不阻塞。 返回值 如果该互斥体已经被上锁,该调用不会阻塞等待,而会返回一个错误代码。 如果上锁成功,将返回0.2.5 解锁头文件 #include <pthread.h> 定义函数 int pthread_mutex_unlock( pthread_mutex_t *mutex ); 函数说明 该函数用来对一个互斥体解锁。如果当前线程拥有参数mutex 所指定的互斥体,该调用将该互斥体解锁。 如果解锁成功,将返回0. 说明: 对同一个锁多次解锁没有叠加效果,如果锁是上锁状态,那么多次解锁也只有一次有效。3. 互斥锁框架运用模型pthread_mutex_t mutex; void 线程1(void) { while(1) { //上锁 pthread_mutex_lock(&mutex); .....主体代码...... //解锁 pthread_mutex_unlock(&mutex); } } void 线程2(void) { while(1) { //上锁 pthread_mutex_lock(&mutex); .....主体代码...... //解锁 pthread_mutex_unlock(&mutex); } } int main(void) { //初始化互斥锁 pthread_mutex_init(&mutex,NULL); .....主体代码...... //销毁互斥锁 pthread_mutex_destroy(&mutex); }4. 案例代码: 对公共函数上锁保护下面代码是两个线程同时调用了一个打印函数,分别打印: “123” “456”。void print(char *p) { while(*p!='\0') { printf("%c",*p++); sleep(1); } } void *thread1_func(void *arg) { print("123\n"); } void *thread2_func(void *arg) { print("456\n"); }如果不保护,默认的打印结果:[wbyq@wbyq linux-share-dir]$ ./a.out 412536 预期的结果应该是打印123\456连续在一起的,对于这种情况,就可以加锁进行保护。上锁的示例代码:#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex; void print(char *p) { while(*p!='\0') { printf("%c",*p++); sleep(1); } } /* 线程工作函数 */ void *thread_work_func(void *dev) { while(1) { //上锁 pthread_mutex_lock(&mutex); print("123\n"); //解锁 pthread_mutex_unlock(&mutex); usleep(1000*10); } } /* 线程工作函数 */ void *thread_work_func2(void *dev) { //上锁 pthread_mutex_lock(&mutex); print("456\n"); //解锁 pthread_mutex_unlock(&mutex); usleep(1000*10); } int main(int argc,char **argv) { //初始化互斥锁 pthread_mutex_init(&mutex,NULL); /*1. 创建子线程1*/ pthread_t thread_id; if(pthread_create(&thread_id,NULL,thread_work_func,NULL)!=0) { printf("子线程1创建失败.\n"); return -1; } /*2. 创建子线程2*/ pthread_t thread_id2; if(pthread_create(&thread_id2,NULL,thread_work_func2,NULL)!=0) { printf("子线程2创建失败.\n"); return -1; } /*3. 等待线程的介绍*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //销毁互斥锁 pthread_mutex_destroy(&mutex); return 0; }5. 案例代码: 模拟火车票售卖系统(保护同一个全局变量)下面代码模拟一个火车票售卖系统,此处不加锁,可能会出现卖出负数票的情况。#include <stdio.h> #include <pthread.h> int cnt = 121; //火车票,公共资源(全局) void* pthread1(void* args) { while(ticketcount > 0) { printf("窗口A开始售票,门票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); sleep(2); cnt--; printf("窗口A售票结束,最后一张车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); } } void* pthread2(void* args) { while(cnt > 0) { printf("窗口B开始售票,车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); sleep(2); cnt--; printf("窗口B售票结束,最后一张车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); } } int main() { pthread_t pthid1 = 0; pthread_t pthid2 = 0; pthread_create(&pthid1,NULL,pthread1,NULL); pthread_create(&pthid2,NULL,pthread2,NULL); pthread_join(pthid1,NULL); pthread_join(pthid2,NULL); return 0; }加锁之后的火车售票系统#include <stdio.h> #include <pthread.h> int cnt = 121; pthread_mutex_t lock; void* pthread1(void* args) { while(1) { pthread_mutex_lock(&lock); //因为要访问全局的共享变量,所以就要加锁 if(cnt > 0) //如果有票 { printf("窗口A开始售票,车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); sleep(2); cnt--; printf("窗口A售票结束,最后一张车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); } else { pthread_mutex_unlock(&lock); pthread_exit(NULL); } pthread_mutex_unlock(&lock); sleep(1); //要放到锁的外面,让另一个有时间锁 } } void* pthread2(void* args) { while(1) { pthread_mutex_lock(&lock); if(cnt>0) { printf("窗口B开始售票--车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); sleep(2); cnt--; printf("窗口B售票结束,最后一张车票是:×716756e-e238-42e5-8f5a-ce36deadf8ben",cnt); } else { pthread_mutex_unlock(&lock); pthread_exit(NULL); } pthread_mutex_unlock(&lock); sleep(1); } } int main() { pthread_t pthid1 = 0; pthread_t pthid2 = 0; //初始化锁 pthread_mutex_init(&lock,NULL); //创建线程 pthread_create(&pthid1,NULL,pthread1,NULL); pthread_create(&pthid2,NULL,pthread2,NULL); //等待线程结束 pthread_join(pthid1,NULL); pthread_join(pthid2,NULL); //销毁锁 pthread_mutex_destroy(&lock); return 0; }
  • [高校开发者专区] 【HCSD-DevCloud训练营学习笔记】飞机大战经典游戏上云实验技术关键点总结
    在参加完《HCSD-DevCloud训练营》 第二期活动之后,进行了飞机大战游戏的上云实践,我能够利用DevCloud完成飞机大战的开发与部署;熟悉了飞机大战开发的整体流程, 熟悉了华为云服务,如VPC、ECS等;学会了用Cocos Creator游戏引擎进行游戏开发。以下内容是我个人对游戏上云部署实践的一些总结性笔记。(如需转贴请提前告知,谢谢~)实验理论重点内容:1、DevOps源于Google、Amazon、Facebook等企业实践,2008年PatrickDebois在“Agile 2008 conference”首次提出DevOps术语,由Filckr展示的开创性的“一天10次部署”,“基础设施即代码”(Mark Burgess和Luke Kanies),“敏捷基础设施”(Andrew Shafer),“敏捷系统管理”(Patrick DeBois),Amazon的“平台即服务”,这些相辅相成,让DevOps在2012~至今成为IT业界潮流。 2、DevOps是Development和Operations两个单词的合称,Dev和Ops存在“混乱之墙”—Andrew Shafer,主要是由于开发人员和运维人员的不同世界观、代码配置环境、脚本不同和存在沟通壁垒三大原因造成的。3、DevOps的五个要素:文化 -建立一体化的全功能团队,打破开发(Dev)与技术运营(Ops)隔阂 自动化 -利用可以利用的所有自动化工具精益-以精益的方式小步快跑,持续改善度量-建立有效的监控与度量手段快速获得反馈,推动产品和团队的持续改进分享-不同职能、不同产品之间分享经验 4、全球软件行业现状及未来预测:· 全球软件产业产值在2018年达到6000亿美元 · 在年复合增长率5%的前提下,2030年将达到1万亿美元,2050年将达到6万亿美元,是2018年的10倍· 据谷歌预测全球开发者数量将在2030年增至5000万人 5、工业化时代和数字化时代:· Gartner:到2020年,云计算成为最主流的IT形态 · IDC:云基础设施投资快速增长,预计2025年占总投资的一半 · RightScale:云在企业的发展成熟度及采用率越来越高到2021年,云服务提供商DC的数量将达企业自建DC数量的2.5倍 6、鲲鹏云服务背景介绍:·华为云发布鲲鹏云服务,开启多元新架构 - 2019年,华为云CTO张宇昕发布四大鲲鹏基础云服务,鲲鹏BMS裸金属服务器、鲲鹏ECS弹性云服务器、鲲鹏Kubernetes容器和鲲鹏Serverless容器,通过不同颗粒度的基础云服务,满足客户多样化的应用和部署要求。同时在鲲鹏云服务之上,华为云打造了一系列面向政府和企业场景的解决方案,支撑行业应用落地;在生态方面,将通过鲲鹏社区聚合生态,联合伙伴共同打造开放共赢的鲲鹏生态,共同分享千亿产业。 7、四大鲲鹏基础云服务:· 鲲鹏BMS裸金属服务器:并发性能领先30%,众核算力优势助力行业升级 · 鲲鹏ECS弹性云服务器:性价比提升30%,高效能优势加速企业创新 · 鲲鹏Kubernetes容器:跨云多平台资源,应用统一管理· 鲲鹏Serverless容器:让鲲鹏算力更易获取、更加普惠 8、为什么选择鲲鹏云平台?· 生态使能 支持开源KVM、Docker、华为云混合云和国产主流商业云平台· 性能更高 鲲鹏多核架构,整机支持创建更多虚拟机· 性能更稳定 基于物理核的虚拟机,高负载压力场景的性能衰减更小· 降低Capex 构建同等规模的虚拟机,需要更小数量的服务器集群· 平滑扩容 支持鲲鹏与x86混合部署,实现现网集群平滑扩容 9、为什么选择Devcloud?· DevCloud提供一站式云端DevOps平台,能够管理软件开发全过程,解决了需求变动频繁、开发测试环境复杂、多版本分支维护困难、无法有效监控进度和质量等研发痛点。 · DevCloud实现了软件研发过程的的可视、可控、可度量,让研发能力提升有章可循。 · 管理看板功能让公司软件研发能力可视化,有助于研发能力短板浮出水面;同时支持跨地域协作,客户可以参与开发,让反馈更快速、迭代更便利。 · 流水线功能能够可视化编排,提供一键式构建、部署;提交代码后可自动触发流水线,让软件上线提速一倍。 10、Devcloud的产品构成:软件开发平台由以下几个主要服务构成:项目管理:软件开发团队提供敏捷项目管理与协作,支持多项目管理、敏捷迭代管理、里程碑管理、需求管理、缺陷跟踪、多维度统计报表等功能。代码托管:面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。流水线:提供可视化、可定制的自动交付流水线,帮助企业缩短交付周期,提升交付效率。代码检查:基于云端实现代码质量管理,软件开发者可在编码完成后执行多语言的代码静态检查和安全检查,获取全面的质量报告,并提供缺陷的分组查看与改进建议,有效管控代码质量,帮助产品成功。编译构建:开发者提供配置简单的混合语言构建平台,实现编译构建云端化,支撑企业实现持续交付,缩短交付周期,提升交付效率。支持编译构建任务一键创建、配置和执行,实现获取代码、构建、打包等活动自动化,实时监控构建状态,让您更加快速、高效地进行云端编译构建。部署:提供可视化、一键式部署服务,支持部署到虚拟机或者容器,提供Tomcat、SpringBoot等模板或者自由组装编排原子步骤进行部署,支持并行部署和流水线无缝集成,实现部署环境标准化和部署过程自动化。云测:面向软件开发者提供一站式云端测试平台,覆盖功能测试、接口测试,融入DevOps敏捷测试理念,帮助您高效管理测试活动,保障产品高质量交付。制品仓库:为软件开发团队提供管理软件发布过程的能力,保障软件发布过程的规范化、可视化及可追溯。CloudIDE:云端开发环境。向开发者提供按需配置、快速获取的工作空间(包含编辑器和运行环境),支持完成环境配置、代码阅读、编写代码、构建、运行、调试、预览等操作,并支持对接多种代码仓库。开源镜像站:由华为云提供的开源组件、开源操作系统及开源DevOps工具镜像站,致力为用户提供全面、高速、可信的开源组件/OS/工具下载服务。实验操作重点内容:1.创建虚拟私有云、创建安全组、为安全组添加规则2.购买鲲鹏云服务器3.创建DevCloud项目4.上传代码 5.编译构建6.部署应用7.实验验证8.资源释放  
  • [问题求助] mxStreamManager.DestroyAllStreams();接口死锁问题
    华为视频转码服务器,接口死锁问题。
  • [企业应用] 领跑政务云,连续五年中国第一【转载】
    【摘要】 华为云连续5年保持中国政务云基础设施市场份额第一。从2012年开始深耕政务云市场,至今,累计服务了超过700个政务云项目。全球权威IT市场研究和咨询公司IDC发布《中国智慧城市数据跟踪报告》(2022年7月)华为云连续5年保持中国政务云基础设施市场份额第一其中华为云在政务专属云基础设施市场占有率27.1%,排名第一华为云在政务公有云基础设施市场份额持续攀升华为云在政务云市场十年磨一剑,持续赢得信赖10年深耕,700+政务云实践华为云从2012年开始深耕政务云市场,至今,累计服务了超过700个政务云项目,包括:40多个国家部委级项目,包括国家气象局、国家信息中心等;40多个省/直辖市项目,包括北京市、上海市、广东省、江苏省等;630多个市县政府和委办局项目,包括广州、深圳、南京、长沙、武汉、许昌等。江苏财政基于华为云Stack建设全省大集中的预算管理一体化系统。自该系统全面上线以来,已有超过四万家单位、十多万个用户接入一体化系统,日均在线用户近两万人。与原先分散建设的模式相比,用了不到十分之一的建设资金,却取得了突破性成效。除了大大节约建设成本外,还实现了对财政资金和项目的实时跟踪、全程追溯、动态预警,这将对未来财政的管理方式的变革,发挥非常重要的作用。武汉市联合华为云打造全国首个城市云,基于“一城一云”的理念,按照3域、1云管、3体系,即“313”架构进行设计,以“云网合一、云数联动”为架构,建设全市集面向数字政府、数字社会、数字经济为一体的武汉云,构建统一云管理服务平台,通过云资源的统一申请、受理、运行监控能力,实现全市云网一体化可视可管;并构建完善的信息安全保障体系、运营运维保障体系和标准规范体系;同时建成全国首个城市云应用商店,作为智慧应用的分发入口,赋能生态合作伙伴共建数字城市新生态,共同为武汉市全领域数字化创新添砖加瓦。政务场景与技术创新深度融合华为云基于“深耕数字化、一切皆服务”的战略,携手政府行业客户,在智慧城市、政务大数据、一网统管、财政一体化、智慧人社等领域共同探索新场景与技术的深度融合。传统智慧城市加速向数字孪生城市演进,从政务大数据演进到城市运行大数据,打造更全面的感知、协同和智能能力,探索更有温度的未来城市实践。政务大数据进一步扩展更多民生服务场景,通过抗疫大数据1个数据底座、1套数据集支持N种抗疫应用,改变传统人拉肩扛的局面,以科技助力抗疫。“一网统管”正在成为实现城市治理现代化的新手段,通过城市智能中枢,融汇、治理城市全域数据,利用大数据、AI技术等进行智能判断和任务分发,并通过线上线下联动,实现业务应用精准执行、任务高效闭环。财政行业全面推进预算管理一体化建设,通过云平台建设实现资源集约,利用大数据技术实现内外部信息整合和数据治理,进而提升财政管理水平。智慧人社积极推进民生服务“一卡通用”,依托民生云之上提供的微服务、AI、大数据、区块链等技术,打通人社和各委办局的权益数据,实现众多民生能力及服务场景。四大关键能力,持续赢得信赖面向政府行业,华为云坚持持续创新,以“云原生×分布式”为底座,以基础创新与应用创新并举的方式,加速城市全领域数字化创新。华为云Stack通过本地部署满足用户合规诉求,并通过持续同步华为公有云能力,提供AI、大数据、数据库、区块链、IoT等80+云服务能力,兼顾公有云的快速创新能力和私有云的可管可控。华为云Stack具备四大关键能力,深受政府行业客户信赖:▍坚实基座多元算力、多云协同、多域容灾、多级云管及多维安全,打造坚实的云化底座,帮助用户推进基础设施全面云化战略。如在政府客户比较关心的安全领域,基于云原生安全服务+云服务内生安全,华为云Stack推出等保安全、密评安全、数据安全和安全云脑四大解决方案,为政务云提供全面的安全防护。▍数据智能基于湖仓一体的理念,推进实时、逻辑数据湖方向发展,将AI引入生产环节,让生产更智能。▍敏捷应用全栈创新的分布式新核心解决方案,生态开放、架构灵活,为核心业务系统提供更好的选择。▍卓越服务华为云将华为公司服务ICT领域30多年的经验沉淀为方法论,形成覆盖咨询、建云、上云、管云、用云全流程的专业服务,帮助政府客户构建可持续演进、可持续运营的一朵云。未来,华为云将继续乘风破浪,持续创新,携手客户、合作伙伴和开发者,抓住“深耕数字化、一切皆服务”的机遇,让云无处不在,让智能无所不及,共建智能世界云底座。【文章来源】:cid:link_0
  • [大赛专区] 【竞答奖&大作业】【名单公布&领奖】华为大连人才云夏季训练营·知识竞答
    一、竞答奖&大作业 获奖名单公布(也可见附件)竞答奖:大作业:二、竞答奖规则5天竞答内容,有1天答题全部正确,获得数据线礼品,共300名,先到先得5天竞答内容,有3天答题全部正确,获得大狮pvc包礼品,共100名,先到先得5天竞答内容,5天全部答题正确,获得华为定制卫衣,共50名,先到先得第七天大作业:由华为云AppCube专家 评选出排名前10的选手,获得大师护体双肩包三、竞答奖&大作业 领奖方式1、请获奖选手按照以下格式回复帖子,来领取你的奖品哦~(回帖仅楼主可见)华为云账号+姓名+手机号+收货地址2、请在公布名单7天内(截止到9月2日),提供收货信息,超时视为放弃;3、礼品会在公布名单15个工作日内发放完成。
总条数:90 到第
上滑加载中