|
【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 分 |
|