电子产业一站式赋能平台

PCB联盟网

搜索
查看: 788|回复: 0
收起左侧

【HarmonyOS HiSpark AI Camera试用连载 】第三次回眸-鸿蒙的线程和互斥锁

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-11-13 03:56:32 | 显示全部楼层 |阅读模式
【HarmonyOS HiSpark AI Camera试用连载 】第三次回眸-鸿蒙的线程和互斥锁,   
本帖最后由 瑟寒凌风 于 2020-11-13 02:25 编辑



谁? 我! 是你? 是我! 你终于来了! 我终于来了! 你终究是来了? 我终究是来了! 你来干什么! 我来写多线程和互斥锁!



本文参照https://device.harmonyos.com/cn/ ... ad-0000001050141770提供的API进行编程。 多线程在多核处理器可以加快运行时间,在单核处理器上没有什么优势。 线程同步,最常用的是互斥锁、条件变量、信号量和读写锁。 我的这个例子里面,使用漏桶算法,加入互斥锁、条件变量,用来控制数据的流入。程序的功能是计算两个数之间的质数,并且打印出来。 首先建立pthread.c文件,然后开始代码之旅。

质数也叫素数,是只能被1和它本身整除的数,1不算质数。根据这个原则,在代码中通过循环除来判断。废话不多说,直接上代码...额抱歉,我确实觉得发烧友的这个代码样式上来之后不好看,还是把源文件放在附件上面吧。 常用的几个函数: pthread_create创建新线程; pthread_mutex_lock互斥锁加锁操作; pthread_cond_wait等待条件; pthread_cond_signal解除被阻塞的线程;

  • #include <stdio.h>
      
  • #include <stdlib.h>
      
  • #include <pthread.h>
      
  • #define MIN         30000000
      
  • #define MAX         30000200
      
  • #define THRNUM        3
      
  • static int num = 0;
      
  • static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
      
  • static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
      
  • void *func(void *arg)
      
  • {
      
  •         int i,j,flag;
      
  •         while(1)
      
  •         {
      
  •                 pthread_mutex_lock(&mutex);//互斥锁加锁操作
      

  •   
  •                 while(num == 0)
      
  •                 {        
      
  •                         pthread_cond_wait(&cond,&mutex);//等待条件
      
  •                 }
      
  •                
      
  •                 if(num == -1)
      
  •                 {
      
  •                         pthread_mutex_unlock(&mutex);//互斥锁解锁
      
  •                         break;
      
  •                 }
      
  •                 i = num;
      
  •                 num = 0;
      
  •                 pthread_cond_broadcast(&cond);//解除若干已被等待条件阻塞的线程
      
  •                 pthread_mutex_unlock(&mutex);//互斥锁解锁操作
      
  •                 flag = 1;
      
  •                 for(j = 2; j < i/2; j++)//该循环判断质数条件
      
  •                 {
      
  •                         if(i % j == 0)
      
  •                         {
      
  •                                 flag = 0;
      
  •                                 break;
      
  •                         }
      
  •                 }
      
  •                 if(flag)
      
  •                         printf(“%d is primer\n“,i);//打印质数
      
  •         }
      
  •         pthread_exit(NULL);
      
  • }
      
  • int main(void)
      
  • {
      
  •         pthread_t tid[THRNUM];
      
  •         int i;
      
  •         for(i = 0; i < THRNUM; i++)
      
  •         {
      
  •                 pthread_create(tid+i,NULL,func,NULL);//创建一个新的线程
      
  •         }
      
  •         for(i = MIN; i <= MAX; i++)
      
  •         {
      
  •                 pthread_mutex_lock(&mutex);//互斥锁加锁操作
      
  •                 while(num != 0)
      
  •                 {
      
  •                         pthread_cond_wait(&cond,&mutex);//等待条件
      
  •                 }
      

  •   
  •                 num = i;
      
  •                 pthread_cond_signal(&cond);//解除被阻塞的线程
      
  •                 pthread_mutex_unlock(&mutex);//互斥锁解锁操作
      
  •         }
      
  •         pthread_mutex_lock(&mutex);//互斥锁加锁操作
      
  •         while(num != 0)
      
  •         {
      
  •                 pthread_cond_wait(&cond,&mutex);//等待条件
      
  •         }
      
  •         num = -1;
      
  •         pthread_cond_signal(&cond);//解除被阻塞的线程
      
  •         pthread_mutex_unlock(&mutex);//互斥锁解锁操作
      
  •         for(i = 0 ; i < THRNUM; i++)
      
  •                 pthread_join(tid,NULL);//等待指定的线程结束
      
  •         pthread_mutex_destroy(&mutex);//销毁互斥锁
      
  •         pthread_cond_destroy(&cond);//销毁条件变量
      
  •         exit(0);
      
  • }
      

  •   


复制代码

只有当有线程在等待时才对条件变量进行触发。

在调用 pthread_cond_wait 进行条件变量等待操作时,增加一个互斥变量参数是必要的,这是为了避免线程间的竞争和饥饿情况。但是当条件等待返回时候,需要注意的是一定不要遗漏对互斥变量进行解锁。 在编译的时候要注意,你的文件取名为pthread.c,编译可能会被忽略。 在源码的如下目录/HarmonyOS/applications/sample/camera/app/src有个Makefile文件,打开它,更改如下内容:

1.png (132.28 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 原来是helloworld,现在要改。 <span]

2.png (94.82 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 然后返回到源码根目录,执行编译命令

  • python build.py ipcamera_hi3516dv300 -b debug

复制代码 有人在执行这条命令时后面不加 -b debug,也是能够编译的,但是这样系统在启动后,没法在串口交互,想想还是加上吧。

然后烧写文件,使用网口烧录,配置如下



3.png (64.22 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

等系统起来后,输入
./bin/camera_app执行


依次打印质数



4.png (14.42 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传







pthread.c
(1.73 KB, 下载次数: 0) 1 小时前 上传 点击文件名下载附件

下载积分: 积分 -1 分
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表