[文章]

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

2020-11-13 02:22:42  650 线程HarmonyOS HiSpark Camera 鸿蒙系统 鸿蒙系统
分享
0
本帖最后由 瑟寒凌风 于 2020-11-13 09:40 编辑

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


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

质数也叫素数,是只能被1和它本身整除的数,1不算质数。根据这个原则,在代码中通过循环除来判断。废话不多说,直接上代码...额抱歉,我确实觉得发烧友的这个代码样式上来之后不好看,还是把源文件放在附件上面吧。
常用的几个函数:
pthread_create创建新线程;
pthread_mutex_lock互斥锁加锁操作;
pthread_cond_wait等待条件;
pthread_cond_signal解除被阻塞的线程;
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #define MIN         30000000
  5. #define MAX         30000200
  6. #define THRNUM        3
  7. static int num = 0;
  8. static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  9. static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  10. void *func(void *arg)
  11. {
  12.         int i,j,flag;
  13.         while(1)
  14.         {
  15.                 pthread_mutex_lock(&mutex);//互斥锁加锁操作

  16.                 while(num == 0)
  17.                 {        
  18.                         pthread_cond_wait(&cond,&mutex);//等待条件
  19.                 }
  20.                
  21.                 if(num == -1)
  22.                 {
  23.                         pthread_mutex_unlock(&mutex);//互斥锁解锁
  24.                         break;
  25.                 }
  26.                 i = num;
  27.                 num = 0;
  28.                 pthread_cond_broadcast(&cond);//解除若干已被等待条件阻塞的线程
  29.                 pthread_mutex_unlock(&mutex);//互斥锁解锁操作
  30.                 flag = 1;
  31.                 for(j = 2; j < i/2; j++)//该循环判断质数条件
  32.                 {
  33.                         if(i % j == 0)
  34.                         {
  35.                                 flag = 0;
  36.                                 break;
  37.                         }
  38.                 }
  39.                 if(flag)
  40.                         printf("%d is primer\n",i);//打印质数
  41.         }
  42.         pthread_exit(NULL);
  43. }
  44. int main(void)
  45. {
  46.         pthread_t tid[THRNUM];
  47.         int i;
  48.         for(i = 0; i < THRNUM; i++)
  49.         {
  50.                 pthread_create(tid+i,NULL,func,NULL);//创建一个新的线程
  51.         }
  52.         for(i = MIN; i <= MAX; i++)
  53.         {
  54.                 pthread_mutex_lock(&mutex);//互斥锁加锁操作
  55.                 while(num != 0)
  56.                 {
  57.                         pthread_cond_wait(&cond,&mutex);//等待条件
  58.                 }

  59.                 num = i;
  60.                 pthread_cond_signal(&cond);//解除被阻塞的线程
  61.                 pthread_mutex_unlock(&mutex);//互斥锁解锁操作
  62.         }
  63.         pthread_mutex_lock(&mutex);//互斥锁加锁操作
  64.         while(num != 0)
  65.         {
  66.                 pthread_cond_wait(&cond,&mutex);//等待条件
  67.         }
  68.         num = -1;
  69.         pthread_cond_signal(&cond);//解除被阻塞的线程
  70.         pthread_mutex_unlock(&mutex);//互斥锁解锁操作
  71.         for(i = 0 ; i < THRNUM; i++)
  72.                 pthread_join(tid[i],NULL);//等待指定的线程结束
  73.         pthread_mutex_destroy(&mutex);//销毁互斥锁
  74.         pthread_cond_destroy(&cond);//销毁条件变量
  75.         exit(0);
  76. }

复制代码

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

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

在源码的在源码的如下目录/HarmonyOS/applications/sample/camera/app目录下,有个*.gn文件,打开它并修改
2.png
然后返回到源码根目录,执行编译命令
  1. python build.py ipcamera_hi3516dv300 -b debug
复制代码
有人在执行这条命令时后面不加 -b debug,也是能够编译的,但是这样系统在启动后,没法在串口交互,想想还是加上吧。

然后烧写文件,使用网口烧录,配置如下
3.png
等系统起来后,输入./bin/camera_app执行
依次打印质数
4.png



pthread.c (1.73 KB, 下载次数: 1)

评分

参与人数 1积分 +6 收起 理由
emitter + 6 原创技术先锋,加分鼓励!

查看全部评分

kuakewei 3 天前
感谢楼主的分享
回复

举报

评论

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章